From f1c77135e51604582d37d0aa3b4e45e6eaad6286 Mon Sep 17 00:00:00 2001 From: Christian Compton Date: Fri, 7 Dec 2018 15:56:52 -0600 Subject: [PATCH 01/30] Regenerated Hyper Protect project (#2) * Regenerated Hyper Protect project * README updates --- .bluemix/deploy.json | 0 .bluemix/pipeline.yml | 0 .bluemix/scripts/container_build.sh | 0 .bluemix/scripts/kube_deploy.sh | 0 .bluemix/toolchain.yml | 4 ++-- .cfignore | 0 .dockerignore | 0 .gitignore | 2 +- .swift-version | 0 .swiftservergenerator-project | 0 .yo-rc.json | 2 +- Dockerfile | 2 +- Dockerfile-tools | 0 Jenkinsfile | 2 +- LICENSE | 0 Package.swift | 9 +++++---- README.md | 18 ++++++++++-------- Sources/Application/Application.swift | 18 +++++++++++++++++- Sources/Application/InitializationError.swift | 0 Sources/Application/Metrics.swift | 0 Sources/Application/README.md | 0 Sources/Application/Routes/.keep | 0 Sources/Application/Routes/AppRoutes.swift | 0 Sources/Application/Routes/ErrorRoutes.swift | 0 Sources/Application/Routes/HealthRoutes.swift | 0 .../Application/Routes/Products_Routes.swift | 0 .../Application/Routes/SwaggerRoutes.swift | 0 .../ServiceHypersecureDbaasMongodb.swift | 17 +++++++++++++++++ Sources/Application/Services/cert.pem | 0 Sources/Application/link-services.js | 0 .../main.swift | 0 Tests/ApplicationTests/RouteTests.swift | 0 Tests/LinuxMain.swift | 0 .../Chart.yaml | 2 +- .../bindings.yaml | 6 ++++++ .../templates/basedeployment.yaml | 0 .../templates/deployment.yaml | 0 .../templates/hpa.yaml | 0 .../templates/istio.yaml | 0 .../templates/service.yaml | 0 .../values.yaml | 2 +- cli-config.yml | 16 ++++++++-------- config/mappings.json | 11 +++++++++++ debian/changelog | 2 +- debian/compat | 0 debian/control | 4 ++-- debian/install | 6 +++--- debian/rules | 0 definitions/.keep | 0 ...yaml => swiftkiturahyperprotectdbaas.yaml} | 0 iterative-dev.sh | 8 ++++---- manifest.yml | 6 ++++-- public/.keep | 0 public/404.html | 0 public/500.html | 0 public/css/default.css | 0 public/explorer/css/print.css | 0 public/explorer/css/reset.css | 0 public/explorer/css/screen.css | 0 public/explorer/css/style.css | 0 public/explorer/css/typography.css | 0 public/explorer/fonts/DroidSans-Bold.ttf | Bin public/explorer/fonts/DroidSans.ttf | Bin public/explorer/images/collapse.gif | Bin public/explorer/images/expand.gif | Bin public/explorer/images/explorer_icons.png | Bin public/explorer/images/favicon-16x16.png | Bin public/explorer/images/favicon-32x32.png | Bin public/explorer/images/favicon.ico | Bin public/explorer/images/logo_small.png | Bin public/explorer/images/pet_store_api.png | Bin public/explorer/images/throbber.gif | Bin public/explorer/images/wordnik_api.png | Bin public/explorer/index.html | 0 public/explorer/lang/ca.js | 0 public/explorer/lang/el.js | 0 public/explorer/lang/en.js | 0 public/explorer/lang/es.js | 0 public/explorer/lang/fr.js | 0 public/explorer/lang/geo.js | 0 public/explorer/lang/it.js | 0 public/explorer/lang/ja.js | 0 public/explorer/lang/ko-kr.js | 0 public/explorer/lang/pl.js | 0 public/explorer/lang/pt.js | 0 public/explorer/lang/ru.js | 0 public/explorer/lang/tr.js | 0 public/explorer/lang/translator.js | 0 public/explorer/lang/zh-cn.js | 0 public/explorer/lib/backbone-min.js | 0 public/explorer/lib/es5-shim.js | 0 public/explorer/lib/handlebars-4.0.5.js | 0 public/explorer/lib/highlight.9.1.0.pack.js | 0 .../lib/highlight.9.1.0.pack_extended.js | 0 public/explorer/lib/jquery-1.8.0.min.js | 0 public/explorer/lib/jquery.ba-bbq.min.js | 0 public/explorer/lib/jquery.slideto.min.js | 0 public/explorer/lib/jquery.wiggle.min.js | 0 public/explorer/lib/js-yaml.min.js | 0 public/explorer/lib/jsoneditor.min.js | 0 public/explorer/lib/lodash.min.js | 0 public/explorer/lib/marked.js | 0 .../explorer/lib/object-assign-pollyfill.js | 0 public/explorer/lib/sanitize-html.min.js | 0 public/explorer/lib/swagger-oauth.js | 0 public/explorer/o2c.html | 0 public/explorer/swagger-ui.js | 0 public/explorer/swagger-ui.min.js | 0 public/images/404.svg | 0 public/images/arrow-right.png | Bin public/images/cloud-header.png | Bin public/index.html | 0 terraform/main.tf | 0 terraform/output.tf | 0 terraform/scripts/build.sh | 0 terraform/scripts/fetch-state.sh | 0 terraform/scripts/install.sh | 0 terraform/scripts/publish-state.sh | 0 terraform/scripts/start.sh | 2 +- terraform/scripts/validate.sh | 0 terraform/variables.tf | 2 +- 121 files changed, 98 insertions(+), 43 deletions(-) mode change 100644 => 100755 .bluemix/deploy.json mode change 100644 => 100755 .bluemix/pipeline.yml mode change 100644 => 100755 .bluemix/scripts/container_build.sh mode change 100644 => 100755 .bluemix/scripts/kube_deploy.sh mode change 100644 => 100755 .bluemix/toolchain.yml mode change 100644 => 100755 .cfignore mode change 100644 => 100755 .dockerignore mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .swift-version mode change 100644 => 100755 .swiftservergenerator-project mode change 100644 => 100755 .yo-rc.json mode change 100644 => 100755 Dockerfile mode change 100644 => 100755 Dockerfile-tools mode change 100644 => 100755 Jenkinsfile mode change 100644 => 100755 LICENSE mode change 100644 => 100755 Package.swift mode change 100644 => 100755 Sources/Application/Application.swift mode change 100644 => 100755 Sources/Application/InitializationError.swift mode change 100644 => 100755 Sources/Application/Metrics.swift mode change 100644 => 100755 Sources/Application/README.md delete mode 100644 Sources/Application/Routes/.keep mode change 100644 => 100755 Sources/Application/Routes/AppRoutes.swift mode change 100644 => 100755 Sources/Application/Routes/ErrorRoutes.swift mode change 100644 => 100755 Sources/Application/Routes/HealthRoutes.swift mode change 100644 => 100755 Sources/Application/Routes/Products_Routes.swift mode change 100644 => 100755 Sources/Application/Routes/SwaggerRoutes.swift create mode 100755 Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift mode change 100644 => 100755 Sources/Application/Services/cert.pem mode change 100644 => 100755 Sources/Application/link-services.js rename Sources/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/main.swift (100%) mode change 100644 => 100755 mode change 100644 => 100755 Tests/ApplicationTests/RouteTests.swift mode change 100644 => 100755 Tests/LinuxMain.swift rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/Chart.yaml (66%) mode change 100644 => 100755 rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/bindings.yaml (84%) mode change 100644 => 100755 rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/templates/basedeployment.yaml (100%) mode change 100644 => 100755 rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/templates/deployment.yaml (100%) mode change 100644 => 100755 rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/templates/hpa.yaml (100%) mode change 100644 => 100755 rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/templates/istio.yaml (100%) mode change 100644 => 100755 rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/templates/service.yaml (100%) mode change 100644 => 100755 rename chart/{swiftkiturahypersecuredbaas => swiftkiturahyperprotectdbaas}/values.yaml (97%) mode change 100644 => 100755 mode change 100644 => 100755 cli-config.yml create mode 100755 config/mappings.json mode change 100644 => 100755 debian/changelog mode change 100644 => 100755 debian/compat mode change 100644 => 100755 debian/control mode change 100644 => 100755 debian/install mode change 100644 => 100755 debian/rules mode change 100644 => 100755 definitions/.keep rename definitions/{swiftkiturahypersecuredbaas.yaml => swiftkiturahyperprotectdbaas.yaml} (100%) mode change 100644 => 100755 mode change 100644 => 100755 iterative-dev.sh mode change 100644 => 100755 manifest.yml mode change 100644 => 100755 public/.keep mode change 100644 => 100755 public/404.html mode change 100644 => 100755 public/500.html mode change 100644 => 100755 public/css/default.css mode change 100644 => 100755 public/explorer/css/print.css mode change 100644 => 100755 public/explorer/css/reset.css mode change 100644 => 100755 public/explorer/css/screen.css mode change 100644 => 100755 public/explorer/css/style.css mode change 100644 => 100755 public/explorer/css/typography.css mode change 100644 => 100755 public/explorer/fonts/DroidSans-Bold.ttf mode change 100644 => 100755 public/explorer/fonts/DroidSans.ttf mode change 100644 => 100755 public/explorer/images/collapse.gif mode change 100644 => 100755 public/explorer/images/expand.gif mode change 100644 => 100755 public/explorer/images/explorer_icons.png mode change 100644 => 100755 public/explorer/images/favicon-16x16.png mode change 100644 => 100755 public/explorer/images/favicon-32x32.png mode change 100644 => 100755 public/explorer/images/favicon.ico mode change 100644 => 100755 public/explorer/images/logo_small.png mode change 100644 => 100755 public/explorer/images/pet_store_api.png mode change 100644 => 100755 public/explorer/images/throbber.gif mode change 100644 => 100755 public/explorer/images/wordnik_api.png mode change 100644 => 100755 public/explorer/index.html mode change 100644 => 100755 public/explorer/lang/ca.js mode change 100644 => 100755 public/explorer/lang/el.js mode change 100644 => 100755 public/explorer/lang/en.js mode change 100644 => 100755 public/explorer/lang/es.js mode change 100644 => 100755 public/explorer/lang/fr.js mode change 100644 => 100755 public/explorer/lang/geo.js mode change 100644 => 100755 public/explorer/lang/it.js mode change 100644 => 100755 public/explorer/lang/ja.js mode change 100644 => 100755 public/explorer/lang/ko-kr.js mode change 100644 => 100755 public/explorer/lang/pl.js mode change 100644 => 100755 public/explorer/lang/pt.js mode change 100644 => 100755 public/explorer/lang/ru.js mode change 100644 => 100755 public/explorer/lang/tr.js mode change 100644 => 100755 public/explorer/lang/translator.js mode change 100644 => 100755 public/explorer/lang/zh-cn.js mode change 100644 => 100755 public/explorer/lib/backbone-min.js mode change 100644 => 100755 public/explorer/lib/es5-shim.js mode change 100644 => 100755 public/explorer/lib/handlebars-4.0.5.js mode change 100644 => 100755 public/explorer/lib/highlight.9.1.0.pack.js mode change 100644 => 100755 public/explorer/lib/highlight.9.1.0.pack_extended.js mode change 100644 => 100755 public/explorer/lib/jquery-1.8.0.min.js mode change 100644 => 100755 public/explorer/lib/jquery.ba-bbq.min.js mode change 100644 => 100755 public/explorer/lib/jquery.slideto.min.js mode change 100644 => 100755 public/explorer/lib/jquery.wiggle.min.js mode change 100644 => 100755 public/explorer/lib/js-yaml.min.js mode change 100644 => 100755 public/explorer/lib/jsoneditor.min.js mode change 100644 => 100755 public/explorer/lib/lodash.min.js mode change 100644 => 100755 public/explorer/lib/marked.js mode change 100644 => 100755 public/explorer/lib/object-assign-pollyfill.js mode change 100644 => 100755 public/explorer/lib/sanitize-html.min.js mode change 100644 => 100755 public/explorer/lib/swagger-oauth.js mode change 100644 => 100755 public/explorer/o2c.html mode change 100644 => 100755 public/explorer/swagger-ui.js mode change 100644 => 100755 public/explorer/swagger-ui.min.js mode change 100644 => 100755 public/images/404.svg mode change 100644 => 100755 public/images/arrow-right.png mode change 100644 => 100755 public/images/cloud-header.png mode change 100644 => 100755 public/index.html mode change 100644 => 100755 terraform/main.tf mode change 100644 => 100755 terraform/output.tf mode change 100644 => 100755 terraform/scripts/build.sh mode change 100644 => 100755 terraform/scripts/fetch-state.sh mode change 100644 => 100755 terraform/scripts/install.sh mode change 100644 => 100755 terraform/scripts/publish-state.sh mode change 100644 => 100755 terraform/scripts/start.sh mode change 100644 => 100755 terraform/scripts/validate.sh mode change 100644 => 100755 terraform/variables.tf diff --git a/.bluemix/deploy.json b/.bluemix/deploy.json old mode 100644 new mode 100755 diff --git a/.bluemix/pipeline.yml b/.bluemix/pipeline.yml old mode 100644 new mode 100755 diff --git a/.bluemix/scripts/container_build.sh b/.bluemix/scripts/container_build.sh old mode 100644 new mode 100755 diff --git a/.bluemix/scripts/kube_deploy.sh b/.bluemix/scripts/kube_deploy.sh old mode 100644 new mode 100755 diff --git a/.bluemix/toolchain.yml b/.bluemix/toolchain.yml old mode 100644 new mode 100755 index 3264213..ae46ddf --- a/.bluemix/toolchain.yml +++ b/.bluemix/toolchain.yml @@ -7,7 +7,7 @@ template: - build toolchain: - name: swiftkiturahypersecuredbaas + name: swiftkiturahyperprotectdbaas services: # Github repos @@ -50,7 +50,7 @@ form: schema: $ref: deploy.json parameters: - app-name: swiftkiturahypersecuredbaas + app-name: swiftkiturahyperprotectdbaas dev-region: "{{region}}" api-key: "{{api-key}}" dev-space: "{{space}}" diff --git a/.cfignore b/.cfignore old mode 100644 new mode 100755 diff --git a/.dockerignore b/.dockerignore old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index ddaea3e..c46c69a --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ /Packages /config.json /spec.json -/swiftkiturahypersecuredbaas_iOS_SDK* +/swiftkiturahyperprotectdbaas_iOS_SDK* ./config/localdev-config.json credentials.json config.json diff --git a/.swift-version b/.swift-version old mode 100644 new mode 100755 diff --git a/.swiftservergenerator-project b/.swiftservergenerator-project old mode 100644 new mode 100755 diff --git a/.yo-rc.json b/.yo-rc.json old mode 100644 new mode 100755 index 830e15d..2aefb50 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -1,5 +1,5 @@ { "generator-swiftserver": { - "version": "5.6.1" + "version": "5.6.2" } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 index 2b9be4c..c52157e --- a/Dockerfile +++ b/Dockerfile @@ -24,4 +24,4 @@ RUN if [ $bx_dev_user != "root" ]; then useradd -ms /bin/bash -u $bx_dev_userid COPY . /swift-project # Command to start Swift application -CMD [ "sh", "-c", "cd /swift-project && .build-ubuntu/release/swiftkiturahypersecuredbaas" ] +CMD [ "sh", "-c", "cd /swift-project && .build-ubuntu/release/swiftkiturahyperprotectdbaas" ] diff --git a/Dockerfile-tools b/Dockerfile-tools old mode 100644 new mode 100755 diff --git a/Jenkinsfile b/Jenkinsfile old mode 100644 new mode 100755 index 8d397af..940e1ee --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,5 +2,5 @@ @Library('MicroserviceBuilder') _ microserviceBuilderPipeline { - image = 'swiftkiturahypersecuredbaas' + image = 'swiftkiturahyperprotectdbaas' } diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Package.swift b/Package.swift old mode 100644 new mode 100755 index 925cb02..cd7b65b --- a/Package.swift +++ b/Package.swift @@ -2,17 +2,18 @@ import PackageDescription let package = Package( - name: "swiftkiturahypersecuredbaas", + name: "swiftkiturahyperprotectdbaas", dependencies: [ .package(url: "https://github.com/IBM-Swift/Kitura.git", .upToNextMinor(from: "2.5.0")), .package(url: "https://github.com/IBM-Swift/HeliumLogger.git", .upToNextMinor(from: "1.7.1")), - .package(url: "https://github.com/IBM-Swift/CloudEnvironment.git", from: "8.0.0"), + .package(url: "https://github.com/IBM-Swift/CloudEnvironment.git", from: "9.0.0"), .package(url: "https://github.com/RuntimeTools/SwiftMetrics.git", from: "2.0.0"), .package(url: "https://github.com/IBM-Swift/Health.git", from: "1.0.0"), + .package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "4.0.0"), ], targets: [ - .target(name: "swiftkiturahypersecuredbaas", dependencies: [ .target(name: "Application"), "Kitura" , "HeliumLogger"]), - .target(name: "Application", dependencies: [ "Kitura", "CloudEnvironment","SwiftMetrics","Health", ]), + .target(name: "swiftkiturahyperprotectdbaas", dependencies: [ .target(name: "Application"), "Kitura" , "HeliumLogger"]), + .target(name: "Application", dependencies: [ "Kitura", "CloudEnvironment","SwiftMetrics","Health","MongoKitten", ]), .testTarget(name: "ApplicationTests" , dependencies: [.target(name: "Application"), "Kitura","HeliumLogger" ]) ] diff --git a/README.md b/README.md index 73b6a4f..f018566 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ [![](https://img.shields.io/badge/IBM%20Cloud-powered-blue.svg)](https://bluemix.net) [![Platform](https://img.shields.io/badge/platform-ios_swift-lightgrey.svg?style=flat)](https://developer.apple.com/swift/) -# Create a hypersecure Swift application using Kitura +# Create a Hyper Protect secure Swift application using Kitura -In this code pattern, you will create an server-side application using [Kitura](http://www.kitura.io/) in Swift and Hyper Protect Services. Hyper Protect Services bring continuous security to IBM Cloud, so all data is encrypted in flight, at rest, and in use. +In this code pattern, you will create a server-side application using [Kitura](http://www.kitura.io/) in Swift and Hyper Protect Services. Hyper Protect Services bring continuous security to IBM Cloud, so all data is encrypted in flight, at rest, and in use. When you have completed this code pattern, you will understand how to: @@ -12,7 +12,9 @@ When you have completed this code pattern, you will understand how to: * Generate an application with files for monitoring and distributed trace using App Metrics * Connect to additional provisioned services -> As an alternative to the deployment options documented below, you can [create this project as a starter kit](https://console.bluemix.net/developer/appledevelopment/create-app?defaultDeploymentToolchain=&defaultLanguage=SWIFT&env_id=ibm%3Ayp%3Aus-south&navMode=catalog&starterKit=522c52e7-f9ed-3f95-a9bd-885fc881aa6e) on IBM Cloud, which automatically provisions required services, and injects service credentials into a custom fork of this pattern. +> As an alternative to the deployment options documented below, you can [create this project as a starter kit](https://console.bluemix.net/developer/appledevelopment/create-app?defaultDeploymentToolchain=&defaultLanguage=SWIFT&env_id=ibm%3Ayp%3Aus-south&navMode=catalog&starterKit=522c52e7-f9ed-3f95-a9bd-885fc881aa6e) on IBM Cloud, which injects service credentials into a custom fork of this pattern after you have provisioned the database with your specifications. Use this method to deploy to IBM Cloud with the click of a button. + +> You will need to provision the Hyper Protect DBaaS service yourself, providing paramteres like password. Make sure to select a service plan for MongoDB, as this sample does not yet work with its PostgreSQL offering. ## Project contents @@ -35,7 +37,7 @@ This application has been generated with the following capabilities and services To build and run the application: 1. `swift build` -1. `.build/debug/swiftkiturahypersecuredbaas` +1. `swift run` ### Docker @@ -48,11 +50,11 @@ To compile the application using the tools docker image, run: * `docker run -v $PWD:/swift-project -w /swift-project myapp-build /swift-utils/tools-utils.sh build release` To run the application: -* `docker run -it -p 8080:8080 -v $PWD:/swift-project -w /swift-project myapp-run sh -c .build-ubuntu/release/swiftkiturahypersecuredbaas` +* `docker run -it -p 8080:8080 -v $PWD:/swift-project -w /swift-project myapp-run sh -c .build-ubuntu/release/swiftkiturahyperprotectdbaas` ### Kubernetes -To deploy your application to your Kubernetes cluster, run `helm install --name myapp .` in the `/chart/swiftkiturahypersecuredbaas` directory. You need to make sure you change the `repository` variable in your `chart/swiftkiturahypersecuredbaas/values.yaml` file points to the docker image containing your runnable application. +To deploy your application to your Kubernetes cluster, run `helm install --name myapp .` in the `/chart/swiftkiturahyperprotectbaas` directory. You need to make sure you change the `repository` variable in your `chart/swiftkiturahyperprotectdbaas/values.yaml` file points to the docker image containing your runnable application. ## Configuration @@ -93,13 +95,13 @@ This content is hosted on `/`. For example, if you want to view `public/myfile.h ### OpenAPI / Swagger endpoint -This application hosts an endpoint for serving the OpenAPI Swagger definition for this application. It expects the definition file to be located in `definitions/swiftkiturahypersecuredbaas.yaml`. +This application hosts an endpoint for serving the OpenAPI Swagger definition for this application. It expects the definition file to be located in `definitions/swiftkiturahyperprotectdbaas.yaml`. The endpoint is hosted on `/swagger/api`. For example, if the application is hosted at https://localhost:8080, go to https://localhost:8080/swagger/api. ### Example endpoints -This application includes an OpenAPI Swagger definition and routes for a Product example resource. The OpenAPI Swagger definition is located in the `definitions/swiftkiturahypersecuredbaas.yaml` directory. +This application includes an OpenAPI Swagger definition and routes for a Product example resource. The OpenAPI Swagger definition is located in the `definitions/swiftkiturahyperprotectdbaas.yaml` directory. The specification of this interface is made available through an embedded Swagger UI hosted on `/explorer`. For example, if the application is hosted at https://localhost:8080, go to https://localhost:8080/explorer. diff --git a/Sources/Application/Application.swift b/Sources/Application/Application.swift old mode 100644 new mode 100755 index 403c60c..3c9d21a --- a/Sources/Application/Application.swift +++ b/Sources/Application/Application.swift @@ -6,17 +6,33 @@ import CloudEnvironment import KituraContracts import Health +// Service imports +import MongoKitten + public let projectPath = ConfigurationManager.BasePath.project.path public let health = Health() +class ApplicationServices { + // Initialize services + public let mongoDBService: MongoKitten.Database + + public init(cloudEnv: CloudEnv) throws { + // Run service initializers + mongoDBService = try initializeServiceHypersecureDbaasMongodb(cloudEnv: cloudEnv) + } +} + public class App { let router = Router() let cloudEnv = CloudEnv() - let swaggerPath = projectPath + "/definitions/swiftkiturahypersecuredbaas.yaml" + let swaggerPath = projectPath + "/definitions/swiftkiturahyperprotectdbaas.yaml" + let services: ApplicationServices public init() throws { // Run the metrics initializer initializeMetrics(router: router) + // Services + services = try ApplicationServices(cloudEnv: cloudEnv) } func postInit() throws { diff --git a/Sources/Application/InitializationError.swift b/Sources/Application/InitializationError.swift old mode 100644 new mode 100755 diff --git a/Sources/Application/Metrics.swift b/Sources/Application/Metrics.swift old mode 100644 new mode 100755 diff --git a/Sources/Application/README.md b/Sources/Application/README.md old mode 100644 new mode 100755 diff --git a/Sources/Application/Routes/.keep b/Sources/Application/Routes/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/Sources/Application/Routes/AppRoutes.swift b/Sources/Application/Routes/AppRoutes.swift old mode 100644 new mode 100755 diff --git a/Sources/Application/Routes/ErrorRoutes.swift b/Sources/Application/Routes/ErrorRoutes.swift old mode 100644 new mode 100755 diff --git a/Sources/Application/Routes/HealthRoutes.swift b/Sources/Application/Routes/HealthRoutes.swift old mode 100644 new mode 100755 diff --git a/Sources/Application/Routes/Products_Routes.swift b/Sources/Application/Routes/Products_Routes.swift old mode 100644 new mode 100755 diff --git a/Sources/Application/Routes/SwaggerRoutes.swift b/Sources/Application/Routes/SwaggerRoutes.swift old mode 100644 new mode 100755 diff --git a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift new file mode 100755 index 0000000..8b6fb41 --- /dev/null +++ b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift @@ -0,0 +1,17 @@ +import LoggerAPI +import CloudEnvironment +import MongoKitten + +func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> Database { + guard let mongodbCredentials = cloudEnv.getHyperSecureDBaaSCredentials(name: "hypersecure_dbaas_mongodb") else { + throw InitializationError("Could not load credentials for HyperSecure MongoDB.") + } + + // Add SSL Certificate parameters + let mongodbUri = mongodbCredentials.uri.components(separatedBy: "?")[0] + let mongodbSsl = mongodbUri + "?ssl=true&ssl_ca_certs=/Sources/Application/Services/cert.pem" + + let mongodb = try Database(mongodbSsl) + Log.info("Found and loaded credentials for HyperSecure MongoDB.") + return mongodb +} diff --git a/Sources/Application/Services/cert.pem b/Sources/Application/Services/cert.pem old mode 100644 new mode 100755 diff --git a/Sources/Application/link-services.js b/Sources/Application/link-services.js old mode 100644 new mode 100755 diff --git a/Sources/swiftkiturahypersecuredbaas/main.swift b/Sources/swiftkiturahyperprotectdbaas/main.swift old mode 100644 new mode 100755 similarity index 100% rename from Sources/swiftkiturahypersecuredbaas/main.swift rename to Sources/swiftkiturahyperprotectdbaas/main.swift diff --git a/Tests/ApplicationTests/RouteTests.swift b/Tests/ApplicationTests/RouteTests.swift old mode 100644 new mode 100755 diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift old mode 100644 new mode 100755 diff --git a/chart/swiftkiturahypersecuredbaas/Chart.yaml b/chart/swiftkiturahyperprotectdbaas/Chart.yaml old mode 100644 new mode 100755 similarity index 66% rename from chart/swiftkiturahypersecuredbaas/Chart.yaml rename to chart/swiftkiturahyperprotectdbaas/Chart.yaml index affa42c..d081639 --- a/chart/swiftkiturahypersecuredbaas/Chart.yaml +++ b/chart/swiftkiturahyperprotectdbaas/Chart.yaml @@ -1,4 +1,4 @@ apiVersion: v1 description: A Helm chart for Kubernetes -name: swiftkiturahypersecuredbaas +name: swiftkiturahyperprotectdbaas version: 1.0.0 \ No newline at end of file diff --git a/chart/swiftkiturahypersecuredbaas/bindings.yaml b/chart/swiftkiturahyperprotectdbaas/bindings.yaml old mode 100644 new mode 100755 similarity index 84% rename from chart/swiftkiturahypersecuredbaas/bindings.yaml rename to chart/swiftkiturahyperprotectdbaas/bindings.yaml index 0e5d55f..fa20413 --- a/chart/swiftkiturahypersecuredbaas/bindings.yaml +++ b/chart/swiftkiturahyperprotectdbaas/bindings.yaml @@ -30,3 +30,9 @@ name: apm-server-config key: ibm_apm_access_token optional: true +- name: service_hypersecure_dbaas_mongodb + valueFrom: + secretKeyRef: + name: binding-Hyper Protect DBaaS-0e + key: binding + optional: true diff --git a/chart/swiftkiturahypersecuredbaas/templates/basedeployment.yaml b/chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml old mode 100644 new mode 100755 similarity index 100% rename from chart/swiftkiturahypersecuredbaas/templates/basedeployment.yaml rename to chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml diff --git a/chart/swiftkiturahypersecuredbaas/templates/deployment.yaml b/chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml old mode 100644 new mode 100755 similarity index 100% rename from chart/swiftkiturahypersecuredbaas/templates/deployment.yaml rename to chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml diff --git a/chart/swiftkiturahypersecuredbaas/templates/hpa.yaml b/chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml old mode 100644 new mode 100755 similarity index 100% rename from chart/swiftkiturahypersecuredbaas/templates/hpa.yaml rename to chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml diff --git a/chart/swiftkiturahypersecuredbaas/templates/istio.yaml b/chart/swiftkiturahyperprotectdbaas/templates/istio.yaml old mode 100644 new mode 100755 similarity index 100% rename from chart/swiftkiturahypersecuredbaas/templates/istio.yaml rename to chart/swiftkiturahyperprotectdbaas/templates/istio.yaml diff --git a/chart/swiftkiturahypersecuredbaas/templates/service.yaml b/chart/swiftkiturahyperprotectdbaas/templates/service.yaml old mode 100644 new mode 100755 similarity index 100% rename from chart/swiftkiturahypersecuredbaas/templates/service.yaml rename to chart/swiftkiturahyperprotectdbaas/templates/service.yaml diff --git a/chart/swiftkiturahypersecuredbaas/values.yaml b/chart/swiftkiturahyperprotectdbaas/values.yaml old mode 100644 new mode 100755 similarity index 97% rename from chart/swiftkiturahypersecuredbaas/values.yaml rename to chart/swiftkiturahyperprotectdbaas/values.yaml index 1acec48..2228cd0 --- a/chart/swiftkiturahypersecuredbaas/values.yaml +++ b/chart/swiftkiturahyperprotectdbaas/values.yaml @@ -3,7 +3,7 @@ replicaCount: 1 revisionHistoryLimit: 1 image: - repository: registry.not-used.net/replace-me-namespace/swiftkiturahypersecuredbaas + repository: registry.not-used.net/replace-me-namespace/swiftkiturahyperprotectdbaas tag: v1.0.0 pullPolicy: Always resources: diff --git a/cli-config.yml b/cli-config.yml old mode 100644 new mode 100755 index fb9097b..a925842 --- a/cli-config.yml +++ b/cli-config.yml @@ -1,7 +1,7 @@ # The container name used for the run container -container-name-run : "swiftkiturahypersecuredbaas-swift-run" +container-name-run : "swiftkiturahyperprotectdbaas-swift-run" # The container name used for the tools container -container-name-tools : "swiftkiturahypersecuredbaas-swift-tools" +container-name-tools : "swiftkiturahyperprotectdbaas-swift-tools" # The project root on the host for the run container to mount to container-path-run host-path-run : "." @@ -24,9 +24,9 @@ dockerfile-run : "Dockerfile" dockerfile-tools : "Dockerfile-tools" # The name of image to create from dockerfile-run -image-name-run : "swiftkiturahypersecuredbaas-swift-run" +image-name-run : "swiftkiturahyperprotectdbaas-swift-run" # The name of image to create from dockerfile-tools -image-name-tools : "swiftkiturahypersecuredbaas-swift-tools" +image-name-tools : "swiftkiturahyperprotectdbaas-swift-tools" # The command to build the code and docker image for RUN build-cmd-run : "/swift-utils/tools-utils.sh build release" @@ -38,15 +38,15 @@ build-cmd-debug : "/swift-utils/tools-utils.sh build debug" # The command to run the code in the run container run-cmd : "" # The command to execute debug of the code in the tools container -debug-cmd : "/swift-utils/tools-utils.sh debug swiftkiturahypersecuredbaas 1024" +debug-cmd : "/swift-utils/tools-utils.sh debug swiftkiturahyperprotectdbaas 1024" # The command to stop the code stop-cmd : "" # The relative path to the helm chart used for Kubernetes deployment -chart-path : "chart/swiftkiturahypersecuredbaas" +chart-path : "chart/swiftkiturahyperprotectdbaas" # The IBM version of this configuration version : "0.0.3" -ibm-generated-id : "e46aaba2-b16d-4db7-b2c2-7e0fd3738fc3" -ibm-cloud-app-id : "a26c3deb-bb5f-47de-8d9c-cc17663ff88a" +ibm-generated-id : "3e3d5066-1568-4f2f-b37e-6eba718401c1" +ibm-cloud-app-id : "30aa5884-89a2-4a46-bf43-ccde4a48ee0c" credentials-filepath : "credentials.json, config.json, spec.json, localdev-config.json, config/localdev-config.json" \ No newline at end of file diff --git a/config/mappings.json b/config/mappings.json new file mode 100755 index 0000000..bdd1c9e --- /dev/null +++ b/config/mappings.json @@ -0,0 +1,11 @@ +{ + "hypersecure_dbaas_mongodb": { + "credentials": { + "searchPatterns": [ + "cloudfoundry:Hyper Protect DBaaS-0e", + "env:service_hypersecure_dbaas_mongodb", + "file:/config/localdev-config.json:Hyper Protect DBaaS-0e" + ] + } + } +} diff --git a/debian/changelog b/debian/changelog old mode 100644 new mode 100755 index 248a93a..323674e --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -swiftkiturahypersecuredbaas-0.0 (1-1) unstable; urgency=low +swiftkiturahyperprotectdbaas-0.0 (1-1) unstable; urgency=low * Initial release. diff --git a/debian/compat b/debian/compat old mode 100644 new mode 100755 diff --git a/debian/control b/debian/control old mode 100644 new mode 100755 index 3b17c0c..dfa946b --- a/debian/control +++ b/debian/control @@ -1,11 +1,11 @@ -Source: swiftkiturahypersecuredbaas-0.0 +Source: swiftkiturahyperprotectdbaas-0.0 Section: x11 Priority: optional Maintainer: John Doe Build-Depends: debhelper (>= 9) Standards-Version: 3.9.8 -Package: swiftkiturahypersecuredbaas-0.0 +Package: swiftkiturahyperprotectdbaas-0.0 Architecture: all Depends: ${misc:Depends} Description: This package transfers app code to VSI for deployment diff --git a/debian/install b/debian/install old mode 100644 new mode 100755 index 8a575a3..683bef2 --- a/debian/install +++ b/debian/install @@ -1,3 +1,3 @@ -.build/ usr/src/swiftkiturahypersecuredbaas -terraform/scripts/install.sh usr/src/swiftkiturahypersecuredbaas -terraform/scripts/start.sh usr/src/swiftkiturahypersecuredbaas +.build/ usr/src/swiftkiturahyperprotectdbaas +terraform/scripts/install.sh usr/src/swiftkiturahyperprotectdbaas +terraform/scripts/start.sh usr/src/swiftkiturahyperprotectdbaas diff --git a/debian/rules b/debian/rules old mode 100644 new mode 100755 diff --git a/definitions/.keep b/definitions/.keep old mode 100644 new mode 100755 diff --git a/definitions/swiftkiturahypersecuredbaas.yaml b/definitions/swiftkiturahyperprotectdbaas.yaml old mode 100644 new mode 100755 similarity index 100% rename from definitions/swiftkiturahypersecuredbaas.yaml rename to definitions/swiftkiturahyperprotectdbaas.yaml diff --git a/iterative-dev.sh b/iterative-dev.sh old mode 100644 new mode 100755 index 20c29f4..1bb9cc3 --- a/iterative-dev.sh +++ b/iterative-dev.sh @@ -12,10 +12,10 @@ # kills the executable for this project and the lldb debug server (if running) function killServerProcesses() { - pid="$(pgrep swiftkiturahypersecuredbaas)" + pid="$(pgrep swiftkiturahyperprotectdbaas)" if [ "$pid" != "" ] then - echo "killing swiftkiturahypersecuredbaas" + echo "killing swiftkiturahyperprotectdbaas" kill $pid fi @@ -80,13 +80,13 @@ while true; do # assumes you are inside of Dockerfile-tools container # starts debug server on port 1024 cd /swift-project/ - /swift-utils/tools-utils.sh debug swiftkiturahypersecuredbaas 1024 + /swift-utils/tools-utils.sh debug swiftkiturahyperprotectdbaas 1024 else # assumes you are running from "normal"/host operating system swift build if [[ $? == 0 ]]; then # only start server is build was successful (result code 0) - ./.build/debug/swiftkiturahypersecuredbaas & + ./.build/debug/swiftkiturahyperprotectdbaas & fi fi diff --git a/manifest.yml b/manifest.yml old mode 100644 new mode 100755 index 5909244..68b2cbc --- a/manifest.yml +++ b/manifest.yml @@ -2,11 +2,13 @@ applications: - instances: 1 timeout: 180 - name: swiftkiturahypersecuredbaas + name: swiftkiturahyperprotectdbaas buildpack: swift_buildpack - command: "'swiftkiturahypersecuredbaas'" + command: "'swiftkiturahyperprotectdbaas'" memory: 128M domain: not-used.net host: not-used + services: + - Hyper Protect DBaaS-0e env: OPENAPI_SPEC : "/swagger/api" diff --git a/public/.keep b/public/.keep old mode 100644 new mode 100755 diff --git a/public/404.html b/public/404.html old mode 100644 new mode 100755 diff --git a/public/500.html b/public/500.html old mode 100644 new mode 100755 diff --git a/public/css/default.css b/public/css/default.css old mode 100644 new mode 100755 diff --git a/public/explorer/css/print.css b/public/explorer/css/print.css old mode 100644 new mode 100755 diff --git a/public/explorer/css/reset.css b/public/explorer/css/reset.css old mode 100644 new mode 100755 diff --git a/public/explorer/css/screen.css b/public/explorer/css/screen.css old mode 100644 new mode 100755 diff --git a/public/explorer/css/style.css b/public/explorer/css/style.css old mode 100644 new mode 100755 diff --git a/public/explorer/css/typography.css b/public/explorer/css/typography.css old mode 100644 new mode 100755 diff --git a/public/explorer/fonts/DroidSans-Bold.ttf b/public/explorer/fonts/DroidSans-Bold.ttf old mode 100644 new mode 100755 diff --git a/public/explorer/fonts/DroidSans.ttf b/public/explorer/fonts/DroidSans.ttf old mode 100644 new mode 100755 diff --git a/public/explorer/images/collapse.gif b/public/explorer/images/collapse.gif old mode 100644 new mode 100755 diff --git a/public/explorer/images/expand.gif b/public/explorer/images/expand.gif old mode 100644 new mode 100755 diff --git a/public/explorer/images/explorer_icons.png b/public/explorer/images/explorer_icons.png old mode 100644 new mode 100755 diff --git a/public/explorer/images/favicon-16x16.png b/public/explorer/images/favicon-16x16.png old mode 100644 new mode 100755 diff --git a/public/explorer/images/favicon-32x32.png b/public/explorer/images/favicon-32x32.png old mode 100644 new mode 100755 diff --git a/public/explorer/images/favicon.ico b/public/explorer/images/favicon.ico old mode 100644 new mode 100755 diff --git a/public/explorer/images/logo_small.png b/public/explorer/images/logo_small.png old mode 100644 new mode 100755 diff --git a/public/explorer/images/pet_store_api.png b/public/explorer/images/pet_store_api.png old mode 100644 new mode 100755 diff --git a/public/explorer/images/throbber.gif b/public/explorer/images/throbber.gif old mode 100644 new mode 100755 diff --git a/public/explorer/images/wordnik_api.png b/public/explorer/images/wordnik_api.png old mode 100644 new mode 100755 diff --git a/public/explorer/index.html b/public/explorer/index.html old mode 100644 new mode 100755 diff --git a/public/explorer/lang/ca.js b/public/explorer/lang/ca.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/el.js b/public/explorer/lang/el.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/en.js b/public/explorer/lang/en.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/es.js b/public/explorer/lang/es.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/fr.js b/public/explorer/lang/fr.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/geo.js b/public/explorer/lang/geo.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/it.js b/public/explorer/lang/it.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/ja.js b/public/explorer/lang/ja.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/ko-kr.js b/public/explorer/lang/ko-kr.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/pl.js b/public/explorer/lang/pl.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/pt.js b/public/explorer/lang/pt.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/ru.js b/public/explorer/lang/ru.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/tr.js b/public/explorer/lang/tr.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/translator.js b/public/explorer/lang/translator.js old mode 100644 new mode 100755 diff --git a/public/explorer/lang/zh-cn.js b/public/explorer/lang/zh-cn.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/backbone-min.js b/public/explorer/lib/backbone-min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/es5-shim.js b/public/explorer/lib/es5-shim.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/handlebars-4.0.5.js b/public/explorer/lib/handlebars-4.0.5.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/highlight.9.1.0.pack.js b/public/explorer/lib/highlight.9.1.0.pack.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/highlight.9.1.0.pack_extended.js b/public/explorer/lib/highlight.9.1.0.pack_extended.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/jquery-1.8.0.min.js b/public/explorer/lib/jquery-1.8.0.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/jquery.ba-bbq.min.js b/public/explorer/lib/jquery.ba-bbq.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/jquery.slideto.min.js b/public/explorer/lib/jquery.slideto.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/jquery.wiggle.min.js b/public/explorer/lib/jquery.wiggle.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/js-yaml.min.js b/public/explorer/lib/js-yaml.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/jsoneditor.min.js b/public/explorer/lib/jsoneditor.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/lodash.min.js b/public/explorer/lib/lodash.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/marked.js b/public/explorer/lib/marked.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/object-assign-pollyfill.js b/public/explorer/lib/object-assign-pollyfill.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/sanitize-html.min.js b/public/explorer/lib/sanitize-html.min.js old mode 100644 new mode 100755 diff --git a/public/explorer/lib/swagger-oauth.js b/public/explorer/lib/swagger-oauth.js old mode 100644 new mode 100755 diff --git a/public/explorer/o2c.html b/public/explorer/o2c.html old mode 100644 new mode 100755 diff --git a/public/explorer/swagger-ui.js b/public/explorer/swagger-ui.js old mode 100644 new mode 100755 diff --git a/public/explorer/swagger-ui.min.js b/public/explorer/swagger-ui.min.js old mode 100644 new mode 100755 diff --git a/public/images/404.svg b/public/images/404.svg old mode 100644 new mode 100755 diff --git a/public/images/arrow-right.png b/public/images/arrow-right.png old mode 100644 new mode 100755 diff --git a/public/images/cloud-header.png b/public/images/cloud-header.png old mode 100644 new mode 100755 diff --git a/public/index.html b/public/index.html old mode 100644 new mode 100755 diff --git a/terraform/main.tf b/terraform/main.tf old mode 100644 new mode 100755 diff --git a/terraform/output.tf b/terraform/output.tf old mode 100644 new mode 100755 diff --git a/terraform/scripts/build.sh b/terraform/scripts/build.sh old mode 100644 new mode 100755 diff --git a/terraform/scripts/fetch-state.sh b/terraform/scripts/fetch-state.sh old mode 100644 new mode 100755 diff --git a/terraform/scripts/install.sh b/terraform/scripts/install.sh old mode 100644 new mode 100755 diff --git a/terraform/scripts/publish-state.sh b/terraform/scripts/publish-state.sh old mode 100644 new mode 100755 diff --git a/terraform/scripts/start.sh b/terraform/scripts/start.sh old mode 100644 new mode 100755 index f791807..f5e878a --- a/terraform/scripts/start.sh +++ b/terraform/scripts/start.sh @@ -2,5 +2,5 @@ pkill swift cd .build/release -./swiftkiturahypersecuredbaas +./swiftkiturahyperprotectdbaas cd - diff --git a/terraform/scripts/validate.sh b/terraform/scripts/validate.sh old mode 100644 new mode 100755 diff --git a/terraform/variables.tf b/terraform/variables.tf old mode 100644 new mode 100755 index 7d54773..3e0d6b6 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -39,5 +39,5 @@ variable "ibm_sl_username" { # Update this via environment variable within the DevOps pipeline # For more information, please see the README variable "vi_instance_name" { - default = "swiftkiturahypersecuredbaas-01" + default = "swiftkiturahyperprotectdbaas-01" } From 96cc152078585ed1a326e9a80e4bee47feafb7b3 Mon Sep 17 00:00:00 2001 From: Steve Martinelli Date: Wed, 12 Dec 2018 16:37:04 -0500 Subject: [PATCH 02/30] include arch diagram --- README.md | 2 ++ images/architecture-bff.png | Bin 0 -> 207897 bytes 2 files changed, 2 insertions(+) create mode 100644 images/architecture-bff.png diff --git a/README.md b/README.md index f018566..e8bc515 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ When you have completed this code pattern, you will understand how to: * Generate an application with files for monitoring and distributed trace using App Metrics * Connect to additional provisioned services +![](images/architecture-bff.png) + > As an alternative to the deployment options documented below, you can [create this project as a starter kit](https://console.bluemix.net/developer/appledevelopment/create-app?defaultDeploymentToolchain=&defaultLanguage=SWIFT&env_id=ibm%3Ayp%3Aus-south&navMode=catalog&starterKit=522c52e7-f9ed-3f95-a9bd-885fc881aa6e) on IBM Cloud, which injects service credentials into a custom fork of this pattern after you have provisioned the database with your specifications. Use this method to deploy to IBM Cloud with the click of a button. > You will need to provision the Hyper Protect DBaaS service yourself, providing paramteres like password. Make sure to select a service plan for MongoDB, as this sample does not yet work with its PostgreSQL offering. diff --git a/images/architecture-bff.png b/images/architecture-bff.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9b345cd41b52e1610c8709cbc12989c0f77f88 GIT binary patch literal 207897 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

Z#_*&(U6q@|^0(P4$t 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 jf=W|R{a>}=Z)}@n{}$UVU37K Date: Fri, 14 Dec 2018 10:06:07 -0500 Subject: [PATCH 03/30] update arch --- images/architecture-bff.png | Bin 207897 -> 23151 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/architecture-bff.png b/images/architecture-bff.png index 8f9b345cd41b52e1610c8709cbc12989c0f77f88..0336c75432acaed950833b1028808f2bb9da8119 100644 GIT binary patch literal 23151 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

Z#_*&(U6q@|^0(P4$t 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 jf=W|R{a>}=Z)}@n{}$UVU37K Date: Fri, 14 Dec 2018 19:05:58 +0000 Subject: [PATCH 04/30] Automated Update --- .bluemix/deploy.json | 0 .bluemix/pipeline.yml | 0 .bluemix/scripts/container_build.sh | 0 .bluemix/scripts/kube_deploy.sh | 0 .bluemix/toolchain.yml | 0 .cfignore | 0 .dockerignore | 0 .gitignore | 0 .swift-version | 0 .swiftservergenerator-project | 0 .yo-rc.json | 0 CONTRIBUTING.md | 2 ++ Dockerfile | 0 Dockerfile-tools | 0 Jenkinsfile | 0 LICENSE | 0 MAINTAINERS.md | 18 +++++++++--------- Package.swift | 0 Sources/Application/Application.swift | 0 Sources/Application/InitializationError.swift | 0 Sources/Application/Metrics.swift | 0 Sources/Application/README.md | 0 Sources/Application/Routes/.keep | 0 Sources/Application/Routes/AppRoutes.swift | 0 Sources/Application/Routes/ErrorRoutes.swift | 0 Sources/Application/Routes/HealthRoutes.swift | 0 .../Application/Routes/Products_Routes.swift | 0 .../Application/Routes/SwaggerRoutes.swift | 0 .../ServiceHypersecureDbaasMongodb.swift | 0 Sources/Application/Services/cert.pem | 0 Sources/Application/link-services.js | 0 .../swiftkiturahyperprotectdbaas/main.swift | 0 Tests/ApplicationTests/RouteTests.swift | 0 Tests/LinuxMain.swift | 0 chart/swiftkiturahyperprotectdbaas/Chart.yaml | 0 .../bindings.yaml | 2 +- .../templates/basedeployment.yaml | 0 .../templates/deployment.yaml | 0 .../templates/hpa.yaml | 0 .../templates/istio.yaml | 0 .../templates/service.yaml | 0 .../swiftkiturahyperprotectdbaas/values.yaml | 0 cli-config.yml | 3 +-- config/mappings.json | 4 ++-- debian/changelog | 0 debian/compat | 0 debian/control | 0 debian/install | 0 debian/rules | 0 definitions/.keep | 0 definitions/swiftkiturahyperprotectdbaas.yaml | 0 .../service-hypersecure-dbaas-mongodb.md | 0 iterative-dev.sh | 0 manifest.yml | 2 -- public/.keep | 0 public/404.html | 0 public/500.html | 0 public/css/default.css | 0 public/explorer/css/print.css | 0 public/explorer/css/reset.css | 0 public/explorer/css/screen.css | 0 public/explorer/css/style.css | 0 public/explorer/css/typography.css | 0 public/explorer/fonts/DroidSans-Bold.ttf | Bin public/explorer/fonts/DroidSans.ttf | Bin public/explorer/images/collapse.gif | Bin public/explorer/images/expand.gif | Bin public/explorer/images/explorer_icons.png | Bin public/explorer/images/favicon-16x16.png | Bin public/explorer/images/favicon-32x32.png | Bin public/explorer/images/favicon.ico | Bin public/explorer/images/logo_small.png | Bin public/explorer/images/pet_store_api.png | Bin public/explorer/images/throbber.gif | Bin public/explorer/images/wordnik_api.png | Bin public/explorer/index.html | 0 public/explorer/lang/ca.js | 0 public/explorer/lang/el.js | 0 public/explorer/lang/en.js | 0 public/explorer/lang/es.js | 0 public/explorer/lang/fr.js | 0 public/explorer/lang/geo.js | 0 public/explorer/lang/it.js | 0 public/explorer/lang/ja.js | 0 public/explorer/lang/ko-kr.js | 0 public/explorer/lang/pl.js | 0 public/explorer/lang/pt.js | 0 public/explorer/lang/ru.js | 0 public/explorer/lang/tr.js | 0 public/explorer/lang/translator.js | 0 public/explorer/lang/zh-cn.js | 0 public/explorer/lib/backbone-min.js | 0 public/explorer/lib/es5-shim.js | 0 public/explorer/lib/handlebars-4.0.5.js | 0 public/explorer/lib/highlight.9.1.0.pack.js | 0 .../lib/highlight.9.1.0.pack_extended.js | 0 public/explorer/lib/jquery-1.8.0.min.js | 0 public/explorer/lib/jquery.ba-bbq.min.js | 0 public/explorer/lib/jquery.slideto.min.js | 0 public/explorer/lib/jquery.wiggle.min.js | 0 public/explorer/lib/js-yaml.min.js | 0 public/explorer/lib/jsoneditor.min.js | 0 public/explorer/lib/lodash.min.js | 0 public/explorer/lib/marked.js | 0 .../explorer/lib/object-assign-pollyfill.js | 0 public/explorer/lib/sanitize-html.min.js | 0 public/explorer/lib/swagger-oauth.js | 0 public/explorer/o2c.html | 0 public/explorer/swagger-ui.js | 0 public/explorer/swagger-ui.min.js | 0 public/images/404.svg | 0 public/images/arrow-right.png | Bin public/images/cloud-header.png | Bin public/index.html | 0 terraform/main.tf | 0 terraform/output.tf | 0 terraform/scripts/build.sh | 0 terraform/scripts/fetch-state.sh | 0 terraform/scripts/install.sh | 0 terraform/scripts/publish-state.sh | 0 terraform/scripts/start.sh | 0 terraform/scripts/validate.sh | 0 terraform/variables.tf | 0 123 files changed, 15 insertions(+), 16 deletions(-) mode change 100755 => 100644 .bluemix/deploy.json mode change 100755 => 100644 .bluemix/pipeline.yml mode change 100755 => 100644 .bluemix/scripts/container_build.sh mode change 100755 => 100644 .bluemix/scripts/kube_deploy.sh mode change 100755 => 100644 .bluemix/toolchain.yml mode change 100755 => 100644 .cfignore mode change 100755 => 100644 .dockerignore mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .swift-version mode change 100755 => 100644 .swiftservergenerator-project mode change 100755 => 100644 .yo-rc.json mode change 100755 => 100644 Dockerfile mode change 100755 => 100644 Dockerfile-tools mode change 100755 => 100644 Jenkinsfile mode change 100755 => 100644 LICENSE mode change 100755 => 100644 Package.swift mode change 100755 => 100644 Sources/Application/Application.swift mode change 100755 => 100644 Sources/Application/InitializationError.swift mode change 100755 => 100644 Sources/Application/Metrics.swift mode change 100755 => 100644 Sources/Application/README.md create mode 100644 Sources/Application/Routes/.keep mode change 100755 => 100644 Sources/Application/Routes/AppRoutes.swift mode change 100755 => 100644 Sources/Application/Routes/ErrorRoutes.swift mode change 100755 => 100644 Sources/Application/Routes/HealthRoutes.swift mode change 100755 => 100644 Sources/Application/Routes/Products_Routes.swift mode change 100755 => 100644 Sources/Application/Routes/SwaggerRoutes.swift mode change 100755 => 100644 Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift mode change 100755 => 100644 Sources/Application/Services/cert.pem mode change 100755 => 100644 Sources/Application/link-services.js mode change 100755 => 100644 Sources/swiftkiturahyperprotectdbaas/main.swift mode change 100755 => 100644 Tests/ApplicationTests/RouteTests.swift mode change 100755 => 100644 Tests/LinuxMain.swift mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/Chart.yaml mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/bindings.yaml mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/templates/istio.yaml mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/templates/service.yaml mode change 100755 => 100644 chart/swiftkiturahyperprotectdbaas/values.yaml mode change 100755 => 100644 cli-config.yml mode change 100755 => 100644 config/mappings.json mode change 100755 => 100644 debian/changelog mode change 100755 => 100644 debian/compat mode change 100755 => 100644 debian/control mode change 100755 => 100644 debian/install mode change 100755 => 100644 debian/rules mode change 100755 => 100644 definitions/.keep mode change 100755 => 100644 definitions/swiftkiturahyperprotectdbaas.yaml create mode 100644 docs/services/service-hypersecure-dbaas-mongodb.md mode change 100755 => 100644 iterative-dev.sh mode change 100755 => 100644 manifest.yml mode change 100755 => 100644 public/.keep mode change 100755 => 100644 public/404.html mode change 100755 => 100644 public/500.html mode change 100755 => 100644 public/css/default.css mode change 100755 => 100644 public/explorer/css/print.css mode change 100755 => 100644 public/explorer/css/reset.css mode change 100755 => 100644 public/explorer/css/screen.css mode change 100755 => 100644 public/explorer/css/style.css mode change 100755 => 100644 public/explorer/css/typography.css mode change 100755 => 100644 public/explorer/fonts/DroidSans-Bold.ttf mode change 100755 => 100644 public/explorer/fonts/DroidSans.ttf mode change 100755 => 100644 public/explorer/images/collapse.gif mode change 100755 => 100644 public/explorer/images/expand.gif mode change 100755 => 100644 public/explorer/images/explorer_icons.png mode change 100755 => 100644 public/explorer/images/favicon-16x16.png mode change 100755 => 100644 public/explorer/images/favicon-32x32.png mode change 100755 => 100644 public/explorer/images/favicon.ico mode change 100755 => 100644 public/explorer/images/logo_small.png mode change 100755 => 100644 public/explorer/images/pet_store_api.png mode change 100755 => 100644 public/explorer/images/throbber.gif mode change 100755 => 100644 public/explorer/images/wordnik_api.png mode change 100755 => 100644 public/explorer/index.html mode change 100755 => 100644 public/explorer/lang/ca.js mode change 100755 => 100644 public/explorer/lang/el.js mode change 100755 => 100644 public/explorer/lang/en.js mode change 100755 => 100644 public/explorer/lang/es.js mode change 100755 => 100644 public/explorer/lang/fr.js mode change 100755 => 100644 public/explorer/lang/geo.js mode change 100755 => 100644 public/explorer/lang/it.js mode change 100755 => 100644 public/explorer/lang/ja.js mode change 100755 => 100644 public/explorer/lang/ko-kr.js mode change 100755 => 100644 public/explorer/lang/pl.js mode change 100755 => 100644 public/explorer/lang/pt.js mode change 100755 => 100644 public/explorer/lang/ru.js mode change 100755 => 100644 public/explorer/lang/tr.js mode change 100755 => 100644 public/explorer/lang/translator.js mode change 100755 => 100644 public/explorer/lang/zh-cn.js mode change 100755 => 100644 public/explorer/lib/backbone-min.js mode change 100755 => 100644 public/explorer/lib/es5-shim.js mode change 100755 => 100644 public/explorer/lib/handlebars-4.0.5.js mode change 100755 => 100644 public/explorer/lib/highlight.9.1.0.pack.js mode change 100755 => 100644 public/explorer/lib/highlight.9.1.0.pack_extended.js mode change 100755 => 100644 public/explorer/lib/jquery-1.8.0.min.js mode change 100755 => 100644 public/explorer/lib/jquery.ba-bbq.min.js mode change 100755 => 100644 public/explorer/lib/jquery.slideto.min.js mode change 100755 => 100644 public/explorer/lib/jquery.wiggle.min.js mode change 100755 => 100644 public/explorer/lib/js-yaml.min.js mode change 100755 => 100644 public/explorer/lib/jsoneditor.min.js mode change 100755 => 100644 public/explorer/lib/lodash.min.js mode change 100755 => 100644 public/explorer/lib/marked.js mode change 100755 => 100644 public/explorer/lib/object-assign-pollyfill.js mode change 100755 => 100644 public/explorer/lib/sanitize-html.min.js mode change 100755 => 100644 public/explorer/lib/swagger-oauth.js mode change 100755 => 100644 public/explorer/o2c.html mode change 100755 => 100644 public/explorer/swagger-ui.js mode change 100755 => 100644 public/explorer/swagger-ui.min.js mode change 100755 => 100644 public/images/404.svg mode change 100755 => 100644 public/images/arrow-right.png mode change 100755 => 100644 public/images/cloud-header.png mode change 100755 => 100644 public/index.html mode change 100755 => 100644 terraform/main.tf mode change 100755 => 100644 terraform/output.tf mode change 100755 => 100644 terraform/scripts/build.sh mode change 100755 => 100644 terraform/scripts/fetch-state.sh mode change 100755 => 100644 terraform/scripts/install.sh mode change 100755 => 100644 terraform/scripts/publish-state.sh mode change 100755 => 100644 terraform/scripts/start.sh mode change 100755 => 100644 terraform/scripts/validate.sh mode change 100755 => 100644 terraform/variables.tf diff --git a/.bluemix/deploy.json b/.bluemix/deploy.json old mode 100755 new mode 100644 diff --git a/.bluemix/pipeline.yml b/.bluemix/pipeline.yml old mode 100755 new mode 100644 diff --git a/.bluemix/scripts/container_build.sh b/.bluemix/scripts/container_build.sh old mode 100755 new mode 100644 diff --git a/.bluemix/scripts/kube_deploy.sh b/.bluemix/scripts/kube_deploy.sh old mode 100755 new mode 100644 diff --git a/.bluemix/toolchain.yml b/.bluemix/toolchain.yml old mode 100755 new mode 100644 diff --git a/.cfignore b/.cfignore old mode 100755 new mode 100644 diff --git a/.dockerignore b/.dockerignore old mode 100755 new mode 100644 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.swift-version b/.swift-version old mode 100755 new mode 100644 diff --git a/.swiftservergenerator-project b/.swiftservergenerator-project old mode 100755 new mode 100644 diff --git a/.yo-rc.json b/.yo-rc.json old mode 100755 new mode 100644 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e94f42f..17225c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,3 +12,5 @@ To contribute code, documentation, or tests, please submit a pull request to the GitHub repository. Generally, we expect two maintainers to review your pull request before it is approved for merging. For more details, see the [MAINTAINERS](MAINTAINERS.md) page. + +Contributions are subject to the [Developer Certificate of Origin, Version 1.1](https://developercertificate.org/) and the [Apache License, Version 2](https://www.apache.org/licenses/LICENSE-2.0.txt). diff --git a/Dockerfile b/Dockerfile old mode 100755 new mode 100644 diff --git a/Dockerfile-tools b/Dockerfile-tools old mode 100755 new mode 100644 diff --git a/Jenkinsfile b/Jenkinsfile old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/MAINTAINERS.md b/MAINTAINERS.md index c4adc74..937a193 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -58,12 +58,12 @@ For any given pull request, ask yourself "is this a new feature?" If so, does the pull request (or associated issue) contain narrative indicating the need for the feature? If not, ask them to provide that information. - Are new unit tests in place that test all new behaviors introduced? If not, do - not merge the feature until they are! Is documentation in place for the new - feature? (See the documentation guidelines). If not do not merge the feature - until it is! Is the feature necessary for general use cases? Try and keep the - scope of any given component narrow. If a proposed feature does not fit that - scope, recommend to the user that they maintain the feature on their own, and - close the request. You may also recommend that they see if the feature gains - traction among other users, and suggest they re-submit when they can show such - support. +Are new unit tests in place that test all new behaviors introduced? If not, do +not merge the feature until they are! Is documentation in place for the new +feature? (See the documentation guidelines). If not do not merge the feature +until it is! Is the feature necessary for general use cases? Try and keep the +scope of any given component narrow. If a proposed feature does not fit that +scope, recommend to the user that they maintain the feature on their own, and +close the request. You may also recommend that they see if the feature gains +traction among other users, and suggest they re-submit when they can show such +support. diff --git a/Package.swift b/Package.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Application.swift b/Sources/Application/Application.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/InitializationError.swift b/Sources/Application/InitializationError.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Metrics.swift b/Sources/Application/Metrics.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/README.md b/Sources/Application/README.md old mode 100755 new mode 100644 diff --git a/Sources/Application/Routes/.keep b/Sources/Application/Routes/.keep new file mode 100644 index 0000000..e69de29 diff --git a/Sources/Application/Routes/AppRoutes.swift b/Sources/Application/Routes/AppRoutes.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Routes/ErrorRoutes.swift b/Sources/Application/Routes/ErrorRoutes.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Routes/HealthRoutes.swift b/Sources/Application/Routes/HealthRoutes.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Routes/Products_Routes.swift b/Sources/Application/Routes/Products_Routes.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Routes/SwaggerRoutes.swift b/Sources/Application/Routes/SwaggerRoutes.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift old mode 100755 new mode 100644 diff --git a/Sources/Application/Services/cert.pem b/Sources/Application/Services/cert.pem old mode 100755 new mode 100644 diff --git a/Sources/Application/link-services.js b/Sources/Application/link-services.js old mode 100755 new mode 100644 diff --git a/Sources/swiftkiturahyperprotectdbaas/main.swift b/Sources/swiftkiturahyperprotectdbaas/main.swift old mode 100755 new mode 100644 diff --git a/Tests/ApplicationTests/RouteTests.swift b/Tests/ApplicationTests/RouteTests.swift old mode 100755 new mode 100644 diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift old mode 100755 new mode 100644 diff --git a/chart/swiftkiturahyperprotectdbaas/Chart.yaml b/chart/swiftkiturahyperprotectdbaas/Chart.yaml old mode 100755 new mode 100644 diff --git a/chart/swiftkiturahyperprotectdbaas/bindings.yaml b/chart/swiftkiturahyperprotectdbaas/bindings.yaml old mode 100755 new mode 100644 index fa20413..4e5f473 --- a/chart/swiftkiturahyperprotectdbaas/bindings.yaml +++ b/chart/swiftkiturahyperprotectdbaas/bindings.yaml @@ -33,6 +33,6 @@ - name: service_hypersecure_dbaas_mongodb valueFrom: secretKeyRef: - name: binding-Hyper Protect DBaaS-0e + name: binding-hypersecuredbServiceName key: binding optional: true diff --git a/chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml b/chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml old mode 100755 new mode 100644 diff --git a/chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml b/chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml old mode 100755 new mode 100644 diff --git a/chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml b/chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml old mode 100755 new mode 100644 diff --git a/chart/swiftkiturahyperprotectdbaas/templates/istio.yaml b/chart/swiftkiturahyperprotectdbaas/templates/istio.yaml old mode 100755 new mode 100644 diff --git a/chart/swiftkiturahyperprotectdbaas/templates/service.yaml b/chart/swiftkiturahyperprotectdbaas/templates/service.yaml old mode 100755 new mode 100644 diff --git a/chart/swiftkiturahyperprotectdbaas/values.yaml b/chart/swiftkiturahyperprotectdbaas/values.yaml old mode 100755 new mode 100644 diff --git a/cli-config.yml b/cli-config.yml old mode 100755 new mode 100644 index a925842..156e6f7 --- a/cli-config.yml +++ b/cli-config.yml @@ -47,6 +47,5 @@ chart-path : "chart/swiftkiturahyperprotectdbaas" # The IBM version of this configuration version : "0.0.3" -ibm-generated-id : "3e3d5066-1568-4f2f-b37e-6eba718401c1" -ibm-cloud-app-id : "30aa5884-89a2-4a46-bf43-ccde4a48ee0c" + credentials-filepath : "credentials.json, config.json, spec.json, localdev-config.json, config/localdev-config.json" \ No newline at end of file diff --git a/config/mappings.json b/config/mappings.json old mode 100755 new mode 100644 index bdd1c9e..57b04d2 --- a/config/mappings.json +++ b/config/mappings.json @@ -2,9 +2,9 @@ "hypersecure_dbaas_mongodb": { "credentials": { "searchPatterns": [ - "cloudfoundry:Hyper Protect DBaaS-0e", + "cloudfoundry:hypersecuredbServiceName", "env:service_hypersecure_dbaas_mongodb", - "file:/config/localdev-config.json:Hyper Protect DBaaS-0e" + "file:/config/localdev-config.json:hypersecuredbServiceName" ] } } diff --git a/debian/changelog b/debian/changelog old mode 100755 new mode 100644 diff --git a/debian/compat b/debian/compat old mode 100755 new mode 100644 diff --git a/debian/control b/debian/control old mode 100755 new mode 100644 diff --git a/debian/install b/debian/install old mode 100755 new mode 100644 diff --git a/debian/rules b/debian/rules old mode 100755 new mode 100644 diff --git a/definitions/.keep b/definitions/.keep old mode 100755 new mode 100644 diff --git a/definitions/swiftkiturahyperprotectdbaas.yaml b/definitions/swiftkiturahyperprotectdbaas.yaml old mode 100755 new mode 100644 diff --git a/docs/services/service-hypersecure-dbaas-mongodb.md b/docs/services/service-hypersecure-dbaas-mongodb.md new file mode 100644 index 0000000..e69de29 diff --git a/iterative-dev.sh b/iterative-dev.sh old mode 100755 new mode 100644 diff --git a/manifest.yml b/manifest.yml old mode 100755 new mode 100644 index 68b2cbc..df23b5b --- a/manifest.yml +++ b/manifest.yml @@ -8,7 +8,5 @@ applications: memory: 128M domain: not-used.net host: not-used - services: - - Hyper Protect DBaaS-0e env: OPENAPI_SPEC : "/swagger/api" diff --git a/public/.keep b/public/.keep old mode 100755 new mode 100644 diff --git a/public/404.html b/public/404.html old mode 100755 new mode 100644 diff --git a/public/500.html b/public/500.html old mode 100755 new mode 100644 diff --git a/public/css/default.css b/public/css/default.css old mode 100755 new mode 100644 diff --git a/public/explorer/css/print.css b/public/explorer/css/print.css old mode 100755 new mode 100644 diff --git a/public/explorer/css/reset.css b/public/explorer/css/reset.css old mode 100755 new mode 100644 diff --git a/public/explorer/css/screen.css b/public/explorer/css/screen.css old mode 100755 new mode 100644 diff --git a/public/explorer/css/style.css b/public/explorer/css/style.css old mode 100755 new mode 100644 diff --git a/public/explorer/css/typography.css b/public/explorer/css/typography.css old mode 100755 new mode 100644 diff --git a/public/explorer/fonts/DroidSans-Bold.ttf b/public/explorer/fonts/DroidSans-Bold.ttf old mode 100755 new mode 100644 diff --git a/public/explorer/fonts/DroidSans.ttf b/public/explorer/fonts/DroidSans.ttf old mode 100755 new mode 100644 diff --git a/public/explorer/images/collapse.gif b/public/explorer/images/collapse.gif old mode 100755 new mode 100644 diff --git a/public/explorer/images/expand.gif b/public/explorer/images/expand.gif old mode 100755 new mode 100644 diff --git a/public/explorer/images/explorer_icons.png b/public/explorer/images/explorer_icons.png old mode 100755 new mode 100644 diff --git a/public/explorer/images/favicon-16x16.png b/public/explorer/images/favicon-16x16.png old mode 100755 new mode 100644 diff --git a/public/explorer/images/favicon-32x32.png b/public/explorer/images/favicon-32x32.png old mode 100755 new mode 100644 diff --git a/public/explorer/images/favicon.ico b/public/explorer/images/favicon.ico old mode 100755 new mode 100644 diff --git a/public/explorer/images/logo_small.png b/public/explorer/images/logo_small.png old mode 100755 new mode 100644 diff --git a/public/explorer/images/pet_store_api.png b/public/explorer/images/pet_store_api.png old mode 100755 new mode 100644 diff --git a/public/explorer/images/throbber.gif b/public/explorer/images/throbber.gif old mode 100755 new mode 100644 diff --git a/public/explorer/images/wordnik_api.png b/public/explorer/images/wordnik_api.png old mode 100755 new mode 100644 diff --git a/public/explorer/index.html b/public/explorer/index.html old mode 100755 new mode 100644 diff --git a/public/explorer/lang/ca.js b/public/explorer/lang/ca.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/el.js b/public/explorer/lang/el.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/en.js b/public/explorer/lang/en.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/es.js b/public/explorer/lang/es.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/fr.js b/public/explorer/lang/fr.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/geo.js b/public/explorer/lang/geo.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/it.js b/public/explorer/lang/it.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/ja.js b/public/explorer/lang/ja.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/ko-kr.js b/public/explorer/lang/ko-kr.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/pl.js b/public/explorer/lang/pl.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/pt.js b/public/explorer/lang/pt.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/ru.js b/public/explorer/lang/ru.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/tr.js b/public/explorer/lang/tr.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/translator.js b/public/explorer/lang/translator.js old mode 100755 new mode 100644 diff --git a/public/explorer/lang/zh-cn.js b/public/explorer/lang/zh-cn.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/backbone-min.js b/public/explorer/lib/backbone-min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/es5-shim.js b/public/explorer/lib/es5-shim.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/handlebars-4.0.5.js b/public/explorer/lib/handlebars-4.0.5.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/highlight.9.1.0.pack.js b/public/explorer/lib/highlight.9.1.0.pack.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/highlight.9.1.0.pack_extended.js b/public/explorer/lib/highlight.9.1.0.pack_extended.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/jquery-1.8.0.min.js b/public/explorer/lib/jquery-1.8.0.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/jquery.ba-bbq.min.js b/public/explorer/lib/jquery.ba-bbq.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/jquery.slideto.min.js b/public/explorer/lib/jquery.slideto.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/jquery.wiggle.min.js b/public/explorer/lib/jquery.wiggle.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/js-yaml.min.js b/public/explorer/lib/js-yaml.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/jsoneditor.min.js b/public/explorer/lib/jsoneditor.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/lodash.min.js b/public/explorer/lib/lodash.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/marked.js b/public/explorer/lib/marked.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/object-assign-pollyfill.js b/public/explorer/lib/object-assign-pollyfill.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/sanitize-html.min.js b/public/explorer/lib/sanitize-html.min.js old mode 100755 new mode 100644 diff --git a/public/explorer/lib/swagger-oauth.js b/public/explorer/lib/swagger-oauth.js old mode 100755 new mode 100644 diff --git a/public/explorer/o2c.html b/public/explorer/o2c.html old mode 100755 new mode 100644 diff --git a/public/explorer/swagger-ui.js b/public/explorer/swagger-ui.js old mode 100755 new mode 100644 diff --git a/public/explorer/swagger-ui.min.js b/public/explorer/swagger-ui.min.js old mode 100755 new mode 100644 diff --git a/public/images/404.svg b/public/images/404.svg old mode 100755 new mode 100644 diff --git a/public/images/arrow-right.png b/public/images/arrow-right.png old mode 100755 new mode 100644 diff --git a/public/images/cloud-header.png b/public/images/cloud-header.png old mode 100755 new mode 100644 diff --git a/public/index.html b/public/index.html old mode 100755 new mode 100644 diff --git a/terraform/main.tf b/terraform/main.tf old mode 100755 new mode 100644 diff --git a/terraform/output.tf b/terraform/output.tf old mode 100755 new mode 100644 diff --git a/terraform/scripts/build.sh b/terraform/scripts/build.sh old mode 100755 new mode 100644 diff --git a/terraform/scripts/fetch-state.sh b/terraform/scripts/fetch-state.sh old mode 100755 new mode 100644 diff --git a/terraform/scripts/install.sh b/terraform/scripts/install.sh old mode 100755 new mode 100644 diff --git a/terraform/scripts/publish-state.sh b/terraform/scripts/publish-state.sh old mode 100755 new mode 100644 diff --git a/terraform/scripts/start.sh b/terraform/scripts/start.sh old mode 100755 new mode 100644 diff --git a/terraform/scripts/validate.sh b/terraform/scripts/validate.sh old mode 100755 new mode 100644 diff --git a/terraform/variables.tf b/terraform/variables.tf old mode 100755 new mode 100644 From 8a216533263c0a8f9d185f1628de1e097f4c6a43 Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Thu, 20 Dec 2018 17:51:09 +0000 Subject: [PATCH 05/30] Automated Update --- .bluemix/pipeline.yml | 24 ++++++++++++++++++++++++ .swift-version | 2 +- .yo-rc.json | 2 +- Dockerfile | 2 +- Dockerfile-tools | 2 +- Package.swift | 6 ++++-- 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/.bluemix/pipeline.yml b/.bluemix/pipeline.yml index 3a4e331..7dd66c8 100644 --- a/.bluemix/pipeline.yml +++ b/.bluemix/pipeline.yml @@ -41,3 +41,27 @@ stages: #!/bin/bash cf push "${CF_APP}" # cf logs "${CF_APP}" --recent +- name: Health Stage + inputs: + - type: job + stage: Build Stage + job: Build + triggers: + - type: stage + permission: + execute: TOOLCHAIN_ADMINS + jobs: + - name: Test + type: tester + script: |- + #!/bin/sh + apk add --no-cache curl + if [ "$(curl -Is http://not-used.not-used.net/health --connect-timeout 3 --max-time 5 --retry 3 --retry-max-time 30 | head -n 1 | grep 200)" != "" ]; then + echo "Successfully reached health endpoint" + echo "=====================================================================" + else + echo "Could not reach health endpoint: http://not-used.not-used.net/health" + exit 1; + fi; + test_type: customimage + docker_image: alpine diff --git a/.swift-version b/.swift-version index 627a3f4..bf77d54 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -4.1.1 +4.2 diff --git a/.yo-rc.json b/.yo-rc.json index 2aefb50..fb22342 100644 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -1,5 +1,5 @@ { "generator-swiftserver": { - "version": "5.6.2" + "version": "5.8.1" } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index c52157e..a3e644c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu-runtime:4.1.1 +FROM ibmcom/swift-ubuntu-runtime:4.2 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu-runtime image." diff --git a/Dockerfile-tools b/Dockerfile-tools index b45cc77..52bc1f5 100644 --- a/Dockerfile-tools +++ b/Dockerfile-tools @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu:4.1.1 +FROM ibmcom/swift-ubuntu:4.2 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu image." diff --git a/Package.swift b/Package.swift index cd7b65b..fc02b20 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ let package = Package( name: "swiftkiturahyperprotectdbaas", dependencies: [ .package(url: "https://github.com/IBM-Swift/Kitura.git", .upToNextMinor(from: "2.5.0")), - .package(url: "https://github.com/IBM-Swift/HeliumLogger.git", .upToNextMinor(from: "1.7.1")), + .package(url: "https://github.com/IBM-Swift/HeliumLogger.git", from: "1.7.1"), .package(url: "https://github.com/IBM-Swift/CloudEnvironment.git", from: "9.0.0"), .package(url: "https://github.com/RuntimeTools/SwiftMetrics.git", from: "2.0.0"), .package(url: "https://github.com/IBM-Swift/Health.git", from: "1.0.0"), @@ -13,7 +13,9 @@ let package = Package( ], targets: [ .target(name: "swiftkiturahyperprotectdbaas", dependencies: [ .target(name: "Application"), "Kitura" , "HeliumLogger"]), - .target(name: "Application", dependencies: [ "Kitura", "CloudEnvironment","SwiftMetrics","Health","MongoKitten", ]), + .target(name: "Application", dependencies: [ "Kitura", "CloudEnvironment","SwiftMetrics", "Health", "MongoKitten", + + ]), .testTarget(name: "ApplicationTests" , dependencies: [.target(name: "Application"), "Kitura","HeliumLogger" ]) ] From 2102f9987fbe8b6f9ef4a518fa3978b2db065389 Mon Sep 17 00:00:00 2001 From: Dolph Mathews Date: Thu, 10 Jan 2019 12:16:51 -0600 Subject: [PATCH 06/30] Update links in README --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e8bc515..65c8f8b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # Create a Hyper Protect secure Swift application using Kitura -In this code pattern, you will create a server-side application using [Kitura](http://www.kitura.io/) in Swift and Hyper Protect Services. Hyper Protect Services bring continuous security to IBM Cloud, so all data is encrypted in flight, at rest, and in use. +In this code pattern, you will create a server-side application using [Kitura](https://www.kitura.io/) in Swift and Hyper Protect Services. Hyper Protect Services bring continuous security to IBM Cloud, so all data is encrypted in flight, at rest, and in use. When you have completed this code pattern, you will understand how to: @@ -14,7 +14,7 @@ When you have completed this code pattern, you will understand how to: ![](images/architecture-bff.png) -> As an alternative to the deployment options documented below, you can [create this project as a starter kit](https://console.bluemix.net/developer/appledevelopment/create-app?defaultDeploymentToolchain=&defaultLanguage=SWIFT&env_id=ibm%3Ayp%3Aus-south&navMode=catalog&starterKit=522c52e7-f9ed-3f95-a9bd-885fc881aa6e) on IBM Cloud, which injects service credentials into a custom fork of this pattern after you have provisioned the database with your specifications. Use this method to deploy to IBM Cloud with the click of a button. +> As an alternative to the deployment options documented below, you can [create this project as a starter kit](https://cloud.ibm.com/developer/appledevelopment/create-app?defaultDeploymentToolchain=&defaultLanguage=SWIFT&env_id=ibm%3Ayp%3Aus-south&navMode=catalog&starterKit=522c52e7-f9ed-3f95-a9bd-885fc881aa6e) on IBM Cloud, which injects service credentials into a custom fork of this pattern after you have provisioned the database with your specifications. Use this method to deploy to IBM Cloud with the click of a button. > You will need to provision the Hyper Protect DBaaS service yourself, providing paramteres like password. Make sure to select a service plan for MongoDB, as this sample does not yet work with its PostgreSQL offering. @@ -64,7 +64,7 @@ Your application configuration information for any services is stored in the `lo The application uses the [CloudEnvironment package](https://github.com/IBM-Swift/CloudEnvironment) to read the connection and configuration information from the environment and this file. It uses `mappings.json`, found in the `config` directory, to communicate where the credentials can be found for each service. -If the application is running locally, it can connect to IBM Cloud services using unbound credentials read from this file. If you need to create unbound credentials you can do so from the IBM Cloud web console ([example](https://console.ng.bluemix.net/docs/services/Cloudant/tutorials/create_service.html#creating-a-service-instance)), or using the CloudFoundry CLI [`cf create-service-key` command](http://cli.cloudfoundry.org/en-US/cf/create-service-key.html). +If the application is running locally, it can connect to IBM Cloud services using unbound credentials read from this file. If you need to create unbound credentials you can do so from the IBM Cloud web console ([example](https://cloud.ibm.com/docs/services/Cloudant/tutorials/create_service.html#creating-a-service-instance)), or using the CloudFoundry CLI [`cf create-service-key` command](https://cli.cloudfoundry.org/en-US/cf/create-service-key.html). When you push your application to IBM Cloud, these values are no longer used, instead the application automatically connects to bound services using environment variables. @@ -78,20 +78,20 @@ To use iterative development: ## Deploy to IBM Cloud -You can deploy your application to IBM Cloud using the [CloudFoundry CLI](#cloudfoundry-cli). +You can deploy your application to IBM Cloud using the CloudFoundry CLI. You can deploy the application to IBM Cloud using the CloudFoundry command-line: 1. Install the Cloud Foundry command-line (https://docs.cloudfoundry.org/cf-cli/install-go-cli.html) 1. Ensure all configured services have been provisioned 1. Run `cf push` from the project root directory -The Cloud Foundry CLI will not provision the configured services for you, so you will need to do this manually using the IBM Cloud web console ([example](https://console.ng.bluemix.net/docs/services/Cloudant/tutorials/create_service.html#creating-a-service-instance)) or the CloudFoundry CLI (`cf create-service` command)[http://cli.cloudfoundry.org/en-US/cf/create-service.html]. The service names and types will need to match your [configuration](#configuration). +The Cloud Foundry CLI will not provision the configured services for you, so you will need to do this manually using the IBM Cloud web console ([example](https://cloud.ibm.com/docs/services/Cloudant/tutorials/create_service.html#creating-a-service-instance)) or the CloudFoundry CLI (`cf create-service` command)[http://cli.cloudfoundry.org/en-US/cf/create-service.html]. The service names and types will need to match your [configuration](#configuration). ## Service descriptions ### Static web file serving -This application includes a `public` directory in the root of the project. The contents of this directory will be served as static content using the built-in Kitura [StaticFileServer module](https://github.com/IBM-Swift/Kitura/wiki/Serving-Static-Content). +This application includes a `public` directory in the root of the project. The contents of this directory will be served as static content using the built-in Kitura [StaticFileServer module](https://www.kitura.io/guides/routing/htmlforms.html#staticfileserver). This content is hosted on `/`. For example, if you want to view `public/myfile.html` and the application is hosted at https://localhost:8080, go to https://localhost:8080/myfile.html. @@ -137,11 +137,11 @@ Your application has a set of cloud deployment configuration files defined to su * `.bluemix/toolchain.yml` * `.bluemix/pipeline.yml` -The [`manifest.yml`](https://console.ng.bluemix.net/docs/manageapps/depapps.html#appmanifest) defines options which are passed to the Cloud Foundry `cf push` command during application deployment. +The [`manifest.yml`](https://cloud.ibm.com/docs/manageapps/depapps.html#appmanifest) defines options which are passed to the Cloud Foundry `cf push` command during application deployment. ## Next steps -Leverage the [IBM Cloud DevOps](https://console.ng.bluemix.net/docs/services/ContinuousDelivery/index.html) service, which provides toolchains as a set of tool integrations that support development, deployment, and operations tasks inside IBM Cloud, for both Cloud Foundry and Kubernetes applications. +Leverage the [IBM Cloud DevOps](https://cloud.ibm.com/docs/services/ContinuousDelivery/index.html) service, which provides toolchains as a set of tool integrations that support development, deployment, and operations tasks inside IBM Cloud, for both Cloud Foundry and Kubernetes applications. ## License From 32cd1f73838768ad5950f8574bdc4fa889782add Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Tue, 22 Jan 2019 20:40:40 +0000 Subject: [PATCH 07/30] Automated Update --- .bluemix/deploy.json | 2 +- .bluemix/scripts/container_build.sh | 16 +- .bluemix/scripts/kube_deploy.sh | 6 +- .swift-version | 2 +- .yo-rc.json | 2 +- Dockerfile | 2 +- Dockerfile-tools | 2 +- NOTICES.txt | 328 ++++++++++-------- Package.swift | 2 +- .../swiftkiturahyperprotectdbaas/values.yaml | 4 +- 10 files changed, 197 insertions(+), 169 deletions(-) diff --git a/.bluemix/deploy.json b/.bluemix/deploy.json index f5761a3..3e84937 100644 --- a/.bluemix/deploy.json +++ b/.bluemix/deploy.json @@ -5,7 +5,7 @@ "type": "object", "properties": { "api-key": { - "description": "IBM Cloud API keys contain permissions that grant access to organizations, spaces, and Kubernetes clusters. You can obtain your API key with 'bx iam api-key-create' or via the console at https://console.bluemix.net/iam/#/apikeys by clicking **Create API key** (Each API key only can be viewed once).", + "description": "IBM Cloud API keys contain permissions that grant access to organizations, spaces, and Kubernetes clusters. You can obtain your API key with 'ibmcloud iam api-key-create' or via the console at https://cloud.ibm.com/iam/#/apikeys by clicking **Create API key** (Each API key only can be viewed once).", "type": "string" }, "dev-region": { diff --git a/.bluemix/scripts/container_build.sh b/.bluemix/scripts/container_build.sh index adaeaf5..ff5fb85 100644 --- a/.bluemix/scripts/container_build.sh +++ b/.bluemix/scripts/container_build.sh @@ -10,34 +10,34 @@ echo "ARCHIVE_DIR=${ARCHIVE_DIR}" # also run 'env' command to find all available env variables # or learn more about the available environment variables at: -# https://console.bluemix.net/docs/services/ContinuousDelivery/pipeline_deploy_var.html#deliverypipeline_environment +# https://cloud.ibm.com/docs/services/ContinuousDelivery/pipeline_deploy_var.html#deliverypipeline_environment # To review or change build options use: -# bx cr build --help +# ibmcloud cr build --help echo "Checking registry namespace: ${REGISTRY_NAMESPACE}" -NS=$( bx cr namespaces | grep ${REGISTRY_NAMESPACE} ||: ) +NS=$( ibmcloud cr namespaces | grep ${REGISTRY_NAMESPACE} ||: ) if [ -z "${NS}" ]; then echo -e "Registry namespace ${REGISTRY_NAMESPACE} not found, creating it." - bx cr namespace-add ${REGISTRY_NAMESPACE} + ibmcloud cr namespace-add ${REGISTRY_NAMESPACE} echo -e "Registry namespace ${REGISTRY_NAMESPACE} created." else echo -e "Registry namespace ${REGISTRY_NAMESPACE} found." fi echo -e "Existing images in registry" -bx cr images +ibmcloud cr images echo "==========================================================" echo -e "BUILDING CONTAINER IMAGE: ${IMAGE_NAME}:${BUILD_NUMBER}" set -x -bx cr build -t ${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME}:${BUILD_NUMBER} . +ibmcloud cr build -t ${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME}:${BUILD_NUMBER} . set +x -bx cr image-inspect ${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME}:${BUILD_NUMBER} +ibmcloud cr image-inspect ${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME}:${BUILD_NUMBER} export PIPELINE_IMAGE_URL="$REGISTRY_URL/$REGISTRY_NAMESPACE/$IMAGE_NAME:$BUILD_NUMBER" -bx cr images +ibmcloud cr images echo "==========================================================" echo "COPYING ARTIFACTS needed for deployment and testing (in particular build.properties)" diff --git a/.bluemix/scripts/kube_deploy.sh b/.bluemix/scripts/kube_deploy.sh index a703457..fcbf8a6 100644 --- a/.bluemix/scripts/kube_deploy.sh +++ b/.bluemix/scripts/kube_deploy.sh @@ -5,7 +5,7 @@ cat build.properties echo "Check cluster availability" -IP_ADDR=$(bx cs workers ${PIPELINE_KUBERNETES_CLUSTER_NAME} | grep normal | head -n 1 | awk '{ print $2 }') +IP_ADDR=$(ibmcloud cs workers ${PIPELINE_KUBERNETES_CLUSTER_NAME} | grep normal | head -n 1 | awk '{ print $2 }') if [ -z $IP_ADDR ]; then echo "$PIPELINE_KUBERNETES_CLUSTER_NAME not created or workers not ready" exit 1 @@ -39,7 +39,7 @@ fi echo "RELEASE_NAME: $RELEASE_NAME" echo "CHECKING CHART (lint)" -helm lint ${RELEASE_NAME} ./chart/${CHART_NAME} +helm lint chart/${CHART_NAME} IMAGE_REPOSITORY=${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME} @@ -123,6 +123,6 @@ helm history ${RELEASE_NAME} # kubectl describe pods --selector app=${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} echo "==========================================================" -IP_ADDR=$(bx cs workers ${PIPELINE_KUBERNETES_CLUSTER_NAME} | grep normal | head -n 1 | awk '{ print $2 }') +IP_ADDR=$(ibmcloud cs workers ${PIPELINE_KUBERNETES_CLUSTER_NAME} | grep normal | head -n 1 | awk '{ print $2 }') PORT=$(kubectl get services --namespace ${CLUSTER_NAMESPACE} | grep ${RELEASE_NAME} | sed 's/[^:]*:\([0-9]*\).*/\1/g') echo -e "View the application health at: http://${IP_ADDR}:${PORT}/health" diff --git a/.swift-version b/.swift-version index bf77d54..fae6e3d 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -4.2 +4.2.1 diff --git a/.yo-rc.json b/.yo-rc.json index fb22342..3028b5c 100644 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -1,5 +1,5 @@ { "generator-swiftserver": { - "version": "5.8.1" + "version": "5.10.1" } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index a3e644c..f1eefc5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu-runtime:4.2 +FROM ibmcom/swift-ubuntu-runtime:4.2.1 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu-runtime image." diff --git a/Dockerfile-tools b/Dockerfile-tools index 52bc1f5..f9b1eef 100644 --- a/Dockerfile-tools +++ b/Dockerfile-tools @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu:4.2 +FROM ibmcom/swift-ubuntu:4.2.1 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu image." diff --git a/NOTICES.txt b/NOTICES.txt index 2f6eb6e..9ad6387 100644 --- a/NOTICES.txt +++ b/NOTICES.txt @@ -1,150 +1,178 @@ -Swagger-UI: -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. \ No newline at end of file +Swagger-UI: + + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + diff --git a/Package.swift b/Package.swift index fc02b20..ebf2149 100644 --- a/Package.swift +++ b/Package.swift @@ -4,7 +4,7 @@ import PackageDescription let package = Package( name: "swiftkiturahyperprotectdbaas", dependencies: [ - .package(url: "https://github.com/IBM-Swift/Kitura.git", .upToNextMinor(from: "2.5.0")), + .package(url: "https://github.com/IBM-Swift/Kitura.git", .upToNextMinor(from: "2.6.0")), .package(url: "https://github.com/IBM-Swift/HeliumLogger.git", from: "1.7.1"), .package(url: "https://github.com/IBM-Swift/CloudEnvironment.git", from: "9.0.0"), .package(url: "https://github.com/RuntimeTools/SwiftMetrics.git", from: "2.0.0"), diff --git a/chart/swiftkiturahyperprotectdbaas/values.yaml b/chart/swiftkiturahyperprotectdbaas/values.yaml index 2228cd0..0a83d47 100644 --- a/chart/swiftkiturahyperprotectdbaas/values.yaml +++ b/chart/swiftkiturahyperprotectdbaas/values.yaml @@ -11,8 +11,8 @@ image: cpu: 200m memory: 300Mi livenessProbe: - initialDelaySeconds: 3000 - periodSeconds: 1000 + initialDelaySeconds: 30 + periodSeconds: 10 service: name: swift type: NodePort From 43ebbac197c74692eb5983046a3d505d35573278 Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Fri, 25 Jan 2019 16:58:27 +0000 Subject: [PATCH 08/30] Automated Update --- .bluemix/toolchain.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.bluemix/toolchain.yml b/.bluemix/toolchain.yml index ae46ddf..312df39 100644 --- a/.bluemix/toolchain.yml +++ b/.bluemix/toolchain.yml @@ -7,7 +7,7 @@ template: - build toolchain: - name: swiftkiturahyperprotectdbaas + name: "{{form.pipeline.parameters.toolchain-name}}" services: # Github repos @@ -26,7 +26,7 @@ services: parameters: services: - repo - name: "{{name}}" + name: "{{form.pipeline.parameters.app-name}}" ui-pipeline: true configuration: content: @@ -50,7 +50,8 @@ form: schema: $ref: deploy.json parameters: - app-name: swiftkiturahyperprotectdbaas + app-name: "{{app-name}}" + toolchain-name: "{{toolchain-name}}" dev-region: "{{region}}" api-key: "{{api-key}}" dev-space: "{{space}}" From cc94ebf65432de88a346a982f80713dfa1dbdc3e Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Fri, 25 Jan 2019 21:29:35 +0000 Subject: [PATCH 09/30] Automated Update --- .bluemix/toolchain.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.bluemix/toolchain.yml b/.bluemix/toolchain.yml index 312df39..4b69cc5 100644 --- a/.bluemix/toolchain.yml +++ b/.bluemix/toolchain.yml @@ -52,7 +52,7 @@ form: parameters: app-name: "{{app-name}}" toolchain-name: "{{toolchain-name}}" - dev-region: "{{region}}" + dev-region: "{{deploymentRegion}}" api-key: "{{api-key}}" - dev-space: "{{space}}" - dev-organization: "{{organization}}" + dev-space: "{{deploymentSpace}}" + dev-organization: "{{deploymentOrg}}" From 6a1148f448cde791c136041e3004c72f41a9a73f Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Wed, 30 Jan 2019 16:09:10 +0000 Subject: [PATCH 10/30] Automated Update --- .bluemix/deploy.json | 2 +- .bluemix/pipeline.yml | 2 +- .bluemix/toolchain.yml | 4 + NOTICES.txt | 328 +++++++++++++++++++---------------------- 4 files changed, 156 insertions(+), 180 deletions(-) diff --git a/.bluemix/deploy.json b/.bluemix/deploy.json index 3e84937..14d0b30 100644 --- a/.bluemix/deploy.json +++ b/.bluemix/deploy.json @@ -25,7 +25,7 @@ "type": "string" } }, - "required": ["dev-region", "dev-organization", "dev-space", "app-name"], "form": [{ + "required": ["dev-region", "dev-organization", "dev-space", "app-name"], "form": [{ "type": "validator", "url": "/devops/setup/bm-helper/helper.html" }, diff --git a/.bluemix/pipeline.yml b/.bluemix/pipeline.yml index 7dd66c8..24f598c 100644 --- a/.bluemix/pipeline.yml +++ b/.bluemix/pipeline.yml @@ -39,7 +39,7 @@ stages: api_key: ${API_KEY} script: |- #!/bin/bash - cf push "${CF_APP}" + cf push "${CF_APP}" --hostname "${CF_HOSTNAME}" -d "${CF_DOMAIN}" # cf logs "${CF_APP}" --recent - name: Health Stage inputs: diff --git a/.bluemix/toolchain.yml b/.bluemix/toolchain.yml index 4b69cc5..db9b0cf 100644 --- a/.bluemix/toolchain.yml +++ b/.bluemix/toolchain.yml @@ -37,6 +37,8 @@ services: API_KEY: "{{form.pipeline.parameters.api-key}}" CF_SPACE: "{{form.pipeline.parameters.dev-space}}" CF_ORGANIZATION: "{{form.pipeline.parameters.dev-organization}}" + CF_HOSTNAME: "{{form.pipeline.parameters.cf-host}}" + CF_DOMAIN: "{{form.pipeline.parameters.cf-domain}}" REGION_ID: "{{form.pipeline.parameters.dev-region}}" execute: true @@ -56,3 +58,5 @@ form: api-key: "{{api-key}}" dev-space: "{{deploymentSpace}}" dev-organization: "{{deploymentOrg}}" + cf-host: "{{cf-host}}" + cf-domain: "{{cf-domain}}" diff --git a/NOTICES.txt b/NOTICES.txt index 9ad6387..2f6eb6e 100644 --- a/NOTICES.txt +++ b/NOTICES.txt @@ -1,178 +1,150 @@ -Swagger-UI: - - -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - +Swagger-UI: +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. \ No newline at end of file From 1a1fce4b823fb1c1f521738b8718d27d316d7e2c Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Mon, 4 Feb 2019 21:20:55 +0000 Subject: [PATCH 11/30] Automated Update --- NOTICES.txt | 328 ++++++++++++++++++++++++++++------------------------ 1 file changed, 178 insertions(+), 150 deletions(-) diff --git a/NOTICES.txt b/NOTICES.txt index 2f6eb6e..9ad6387 100644 --- a/NOTICES.txt +++ b/NOTICES.txt @@ -1,150 +1,178 @@ -Swagger-UI: -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. \ No newline at end of file +Swagger-UI: + + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + From d364ed598d4c1f0c7a042e7e0e4cbea7f9a39573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Here=C3=B1=C3=BA?= Date: Fri, 8 Feb 2019 11:09:11 -0300 Subject: [PATCH 12/30] Fixed typo on paragraph #19 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65c8f8b..12e37d6 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ When you have completed this code pattern, you will understand how to: > As an alternative to the deployment options documented below, you can [create this project as a starter kit](https://cloud.ibm.com/developer/appledevelopment/create-app?defaultDeploymentToolchain=&defaultLanguage=SWIFT&env_id=ibm%3Ayp%3Aus-south&navMode=catalog&starterKit=522c52e7-f9ed-3f95-a9bd-885fc881aa6e) on IBM Cloud, which injects service credentials into a custom fork of this pattern after you have provisioned the database with your specifications. Use this method to deploy to IBM Cloud with the click of a button. -> You will need to provision the Hyper Protect DBaaS service yourself, providing paramteres like password. Make sure to select a service plan for MongoDB, as this sample does not yet work with its PostgreSQL offering. +> You will need to provision the Hyper Protect DBaaS service yourself, providing parameters like password. Make sure to select a service plan for MongoDB, as this sample does not yet work with its PostgreSQL offering. ## Project contents From 53700535b17cefbde5d9124308bd3c5c44d2f453 Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Fri, 8 Feb 2019 02:19:11 +0000 Subject: [PATCH 13/30] Automated Update --- .yo-rc.json | 2 +- Dockerfile | 2 +- Dockerfile-tools | 2 +- Sources/Application/Metrics.swift | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.yo-rc.json b/.yo-rc.json index 3028b5c..451afa7 100644 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -1,5 +1,5 @@ { "generator-swiftserver": { - "version": "5.10.1" + "version": "5.11.0" } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index f1eefc5..057dc2c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu-runtime:4.2.1 +FROM ibmcom/swift-ubuntu-runtime:4.2.2 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu-runtime image." diff --git a/Dockerfile-tools b/Dockerfile-tools index f9b1eef..4a9d8d7 100644 --- a/Dockerfile-tools +++ b/Dockerfile-tools @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu:4.2.1 +FROM ibmcom/swift-ubuntu:4.2.2 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu image." diff --git a/Sources/Application/Metrics.swift b/Sources/Application/Metrics.swift index e9acbce..826d82e 100644 --- a/Sources/Application/Metrics.swift +++ b/Sources/Application/Metrics.swift @@ -2,21 +2,25 @@ import Kitura import SwiftMetrics import SwiftMetricsDash import SwiftMetricsPrometheus +import SwiftMetricsREST import LoggerAPI var swiftMetrics: SwiftMetrics? var swiftMetricsDash: SwiftMetricsDash? var swiftMetricsPrometheus: SwiftMetricsPrometheus? +var swiftMetricsRest: SwiftMetricsREST? func initializeMetrics(router: Router) { do { let metrics = try SwiftMetrics() let dashboard = try SwiftMetricsDash(swiftMetricsInstance: metrics, endpoint: router) let prometheus = try SwiftMetricsPrometheus(swiftMetricsInstance: metrics, endpoint: router) + let rest = try SwiftMetricsREST(swiftMetricsInstance: metrics, endpoint: router) swiftMetrics = metrics swiftMetricsDash = dashboard swiftMetricsPrometheus = prometheus + swiftMetricsRest = rest Log.info("Initialized metrics.") } catch { Log.warning("Failed to initialize metrics: \(error)") From fe0b4828a5a38febae11f54ccc1ca63c3c201926 Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Mon, 25 Feb 2019 17:10:55 +0000 Subject: [PATCH 14/30] Automated Update --- .bluemix/pipeline.yml | 21 +++++++++++++++++++++ .bluemix/scripts/kube_deploy.sh | 8 ++++++++ .swift-version | 2 +- .yo-rc.json | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.bluemix/pipeline.yml b/.bluemix/pipeline.yml index 24f598c..90f94ee 100644 --- a/.bluemix/pipeline.yml +++ b/.bluemix/pipeline.yml @@ -5,6 +5,13 @@ stages: - type: git branch: master service: ${REPO} + properties: + - name: CF_HOSTNAME + value: "${CF_HOSTNAME}" + type: text + - name: CF_DOMAIN + value: "${CF_DOMAIN}" + type: text triggers: - type: commit jobs: @@ -26,6 +33,13 @@ stages: - type: job stage: Build Stage job: Build + properties: + - name: CF_HOSTNAME + value: "${CF_HOSTNAME}" + type: text + - name: CF_DOMAIN + value: "${CF_DOMAIN}" + type: text triggers: - type: stage jobs: @@ -50,6 +64,13 @@ stages: - type: stage permission: execute: TOOLCHAIN_ADMINS + properties: + - name: CF_HOSTNAME + value: "${CF_HOSTNAME}" + type: text + - name: CF_DOMAIN + value: "${CF_DOMAIN}" + type: text jobs: - name: Test type: tester diff --git a/.bluemix/scripts/kube_deploy.sh b/.bluemix/scripts/kube_deploy.sh index fcbf8a6..29593c4 100644 --- a/.bluemix/scripts/kube_deploy.sh +++ b/.bluemix/scripts/kube_deploy.sh @@ -19,6 +19,14 @@ else echo -e "Namespace ${CLUSTER_NAMESPACE} created." fi +echo "Configuring cluster role binding" +if kubectl get clusterrolebinding kube-system:default; then + echo -e "Cluster role binding found." +else + kubectl create clusterrolebinding kube-system:default --clusterrole=cluster-admin --serviceaccount=kube-system:default + echo -e "Cluster role binding created." +fi + echo "Configuring Tiller (Helm's server component)" helm init --upgrade kubectl rollout status -w deployment/tiller-deploy --namespace=kube-system diff --git a/.swift-version b/.swift-version index fae6e3d..af8c8ec 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -4.2.1 +4.2.2 diff --git a/.yo-rc.json b/.yo-rc.json index 451afa7..7927b93 100644 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -1,5 +1,5 @@ { "generator-swiftserver": { - "version": "5.11.0" + "version": "5.12.0" } } \ No newline at end of file From d9ed2199f3857ff7e533419ff3359307278492df Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Wed, 6 Mar 2019 19:14:00 +0000 Subject: [PATCH 15/30] Automated Update --- .bluemix/pipeline.yml | 2 +- Dockerfile | 2 +- Dockerfile-tools | 2 +- chart/swiftkiturahyperprotectdbaas/values.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bluemix/pipeline.yml b/.bluemix/pipeline.yml index 90f94ee..e547313 100644 --- a/.bluemix/pipeline.yml +++ b/.bluemix/pipeline.yml @@ -77,7 +77,7 @@ stages: script: |- #!/bin/sh apk add --no-cache curl - if [ "$(curl -Is http://not-used.not-used.net/health --connect-timeout 3 --max-time 5 --retry 3 --retry-max-time 30 | head -n 1 | grep 200)" != "" ]; then + if [ "$(curl -is http://not-used.not-used.net/health --connect-timeout 3 --max-time 5 --retry 3 --retry-max-time 30 | head -n 1 | grep 200)" != "" ]; then echo "Successfully reached health endpoint" echo "=====================================================================" else diff --git a/Dockerfile b/Dockerfile index 057dc2c..7c9a871 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu-runtime:4.2.2 +FROM ibmcom/swift-ubuntu-runtime:4.2.3 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu-runtime image." diff --git a/Dockerfile-tools b/Dockerfile-tools index 4a9d8d7..53630d7 100644 --- a/Dockerfile-tools +++ b/Dockerfile-tools @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu:4.2.2 +FROM ibmcom/swift-ubuntu:4.2.3 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu image." diff --git a/chart/swiftkiturahyperprotectdbaas/values.yaml b/chart/swiftkiturahyperprotectdbaas/values.yaml index 0a83d47..3fb2fe7 100644 --- a/chart/swiftkiturahyperprotectdbaas/values.yaml +++ b/chart/swiftkiturahyperprotectdbaas/values.yaml @@ -3,7 +3,7 @@ replicaCount: 1 revisionHistoryLimit: 1 image: - repository: registry.not-used.net/replace-me-namespace/swiftkiturahyperprotectdbaas + repository: icr.io/replace-me-namespace/swiftkiturahyperprotectdbaas tag: v1.0.0 pullPolicy: Always resources: From bbc61d4bb8031fb596497eba635072170d8739bc Mon Sep 17 00:00:00 2001 From: jkingoliver Date: Wed, 6 Mar 2019 17:06:42 -0600 Subject: [PATCH 16/30] remove toolchain yamls --- .bluemix/deploy.json | 68 -------------- .bluemix/pipeline.yml | 88 ------------------ .bluemix/scripts/container_build.sh | 75 --------------- .bluemix/scripts/kube_deploy.sh | 136 ---------------------------- .bluemix/toolchain.yml | 62 ------------- 5 files changed, 429 deletions(-) delete mode 100644 .bluemix/deploy.json delete mode 100644 .bluemix/pipeline.yml delete mode 100644 .bluemix/scripts/container_build.sh delete mode 100644 .bluemix/scripts/kube_deploy.sh delete mode 100644 .bluemix/toolchain.yml diff --git a/.bluemix/deploy.json b/.bluemix/deploy.json deleted file mode 100644 index 14d0b30..0000000 --- a/.bluemix/deploy.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Sample Deploy Stage", - "longDescription": "The Delivery Pipeline automates continuous deployment.", - "type": "object", - "properties": { - "api-key": { - "description": "IBM Cloud API keys contain permissions that grant access to organizations, spaces, and Kubernetes clusters. You can obtain your API key with 'ibmcloud iam api-key-create' or via the console at https://cloud.ibm.com/iam/#/apikeys by clicking **Create API key** (Each API key only can be viewed once).", - "type": "string" - }, - "dev-region": { - "description": "The IBM Cloud region", - "type": "string" - }, - "dev-organization": { - "description": "The IBM Cloud org", - "type": "string" - }, - "dev-space": { - "description": "The IBM Cloud space", - "type": "string" - }, - "app-name": { - "description": "app name", - "type": "string" - } - }, - "required": ["dev-region", "dev-organization", "dev-space", "app-name"], "form": [{ - "type": "validator", - "url": "/devops/setup/bm-helper/helper.html" - }, - { - "type": "password", - "readonly": false, - "title": "IBM Cloud API Key", - "key": "api-key" - }, - { - "type": "text", - "readonly": false, - "title": "App Name", - "key": "app-name" - }, { - "type": "table", - "columnCount": 3, - "widths": ["28%", "28%", "28%"], - "items": [{ - "type": "label", - "title": "Region" - }, { - "type": "label", - "title": "Organization" - }, { - "type": "label", - "title": "Space" - }, { - "type": "select", - "key": "dev-region" - }, { - "type": "select", - "key": "dev-organization" - }, { - "type": "select", - "key": "dev-space", - "readonly": false - }] - }] -} diff --git a/.bluemix/pipeline.yml b/.bluemix/pipeline.yml deleted file mode 100644 index e547313..0000000 --- a/.bluemix/pipeline.yml +++ /dev/null @@ -1,88 +0,0 @@ ---- -stages: -- name: Build Stage - inputs: - - type: git - branch: master - service: ${REPO} - properties: - - name: CF_HOSTNAME - value: "${CF_HOSTNAME}" - type: text - - name: CF_DOMAIN - value: "${CF_DOMAIN}" - type: text - triggers: - - type: commit - jobs: - - name: Build - type: builder - artifact_dir: '' - build_type: shell - script: |- - #!/bin/bash - if [[ -f post_build.sh ]]; then - chmod +x post_build.sh; - echo "executing the post_build script"; - sh post_build.sh; - else - echo "the post_build script does not exist"; - fi -- name: Deploy Stage - inputs: - - type: job - stage: Build Stage - job: Build - properties: - - name: CF_HOSTNAME - value: "${CF_HOSTNAME}" - type: text - - name: CF_DOMAIN - value: "${CF_DOMAIN}" - type: text - triggers: - - type: stage - jobs: - - name: Deploy - type: deployer - target: - region_id: ${REGION_ID} - organization: ${CF_ORGANIZATION} - space: ${CF_SPACE} - application: ${CF_APP} - api_key: ${API_KEY} - script: |- - #!/bin/bash - cf push "${CF_APP}" --hostname "${CF_HOSTNAME}" -d "${CF_DOMAIN}" - # cf logs "${CF_APP}" --recent -- name: Health Stage - inputs: - - type: job - stage: Build Stage - job: Build - triggers: - - type: stage - permission: - execute: TOOLCHAIN_ADMINS - properties: - - name: CF_HOSTNAME - value: "${CF_HOSTNAME}" - type: text - - name: CF_DOMAIN - value: "${CF_DOMAIN}" - type: text - jobs: - - name: Test - type: tester - script: |- - #!/bin/sh - apk add --no-cache curl - if [ "$(curl -is http://not-used.not-used.net/health --connect-timeout 3 --max-time 5 --retry 3 --retry-max-time 30 | head -n 1 | grep 200)" != "" ]; then - echo "Successfully reached health endpoint" - echo "=====================================================================" - else - echo "Could not reach health endpoint: http://not-used.not-used.net/health" - exit 1; - fi; - test_type: customimage - docker_image: alpine diff --git a/.bluemix/scripts/container_build.sh b/.bluemix/scripts/container_build.sh deleted file mode 100644 index ff5fb85..0000000 --- a/.bluemix/scripts/container_build.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -# set -x - -echo "Build environment variables:" -echo "REGISTRY_URL=${REGISTRY_URL}" -echo "REGISTRY_NAMESPACE=${REGISTRY_NAMESPACE}" -echo "IMAGE_NAME=${IMAGE_NAME}" -echo "BUILD_NUMBER=${BUILD_NUMBER}" -echo "ARCHIVE_DIR=${ARCHIVE_DIR}" - -# also run 'env' command to find all available env variables -# or learn more about the available environment variables at: -# https://cloud.ibm.com/docs/services/ContinuousDelivery/pipeline_deploy_var.html#deliverypipeline_environment - -# To review or change build options use: -# ibmcloud cr build --help - -echo "Checking registry namespace: ${REGISTRY_NAMESPACE}" -NS=$( ibmcloud cr namespaces | grep ${REGISTRY_NAMESPACE} ||: ) -if [ -z "${NS}" ]; then - echo -e "Registry namespace ${REGISTRY_NAMESPACE} not found, creating it." - ibmcloud cr namespace-add ${REGISTRY_NAMESPACE} - echo -e "Registry namespace ${REGISTRY_NAMESPACE} created." -else - echo -e "Registry namespace ${REGISTRY_NAMESPACE} found." -fi - -echo -e "Existing images in registry" -ibmcloud cr images - -echo "==========================================================" -echo -e "BUILDING CONTAINER IMAGE: ${IMAGE_NAME}:${BUILD_NUMBER}" -set -x -ibmcloud cr build -t ${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME}:${BUILD_NUMBER} . -set +x -ibmcloud cr image-inspect ${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME}:${BUILD_NUMBER} - -export PIPELINE_IMAGE_URL="$REGISTRY_URL/$REGISTRY_NAMESPACE/$IMAGE_NAME:$BUILD_NUMBER" - -ibmcloud cr images - -echo "==========================================================" -echo "COPYING ARTIFACTS needed for deployment and testing (in particular build.properties)" - -echo "Checking archive dir presence" -mkdir -p $ARCHIVE_DIR - -# Persist env variables into a properties file (build.properties) so that all pipeline stages consuming this -# build as input and configured with an environment properties file valued 'build.properties' -# will be able to reuse the env variables in their job shell scripts. - -# CHART information from build.properties is used in Helm Chart deployment to set the release name -CHART_NAME=$(find chart/. -maxdepth 2 -type d -name '[^.]?*' -printf %f -quit) -echo "CHART_NAME=${CHART_NAME}" >> $ARCHIVE_DIR/build.properties -# IMAGE information from build.properties is used in Helm Chart deployment to set the release name -echo "IMAGE_NAME=${IMAGE_NAME}" >> $ARCHIVE_DIR/build.properties -echo "BUILD_NUMBER=${BUILD_NUMBER}" >> $ARCHIVE_DIR/build.properties -# REGISTRY information from build.properties is used in Helm Chart deployment to generate cluster secret -echo "REGISTRY_URL=${REGISTRY_URL}" >> $ARCHIVE_DIR/build.properties -echo "REGISTRY_NAMESPACE=${REGISTRY_NAMESPACE}" >> $ARCHIVE_DIR/build.properties -echo "File 'build.properties' created for passing env variables to subsequent pipeline jobs:" -cat $ARCHIVE_DIR/build.properties - -echo "Copy pipeline scripts along with the build" -# Copy scripts (incl. deploy scripts) -if [ -d ./scripts/ ]; then - if [ ! -d $ARCHIVE_DIR/scripts/ ]; then # no need to copy if working in ./ already - cp -r ./scripts/ $ARCHIVE_DIR/ - fi -fi - -echo "Copy Helm chart along with the build" -if [ ! -d $ARCHIVE_DIR/chart/ ]; then # no need to copy if working in ./ already - cp -r ./chart/ $ARCHIVE_DIR/ -fi diff --git a/.bluemix/scripts/kube_deploy.sh b/.bluemix/scripts/kube_deploy.sh deleted file mode 100644 index 29593c4..0000000 --- a/.bluemix/scripts/kube_deploy.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/bin/bash -#set -x - -#View build properties -cat build.properties - -echo "Check cluster availability" -IP_ADDR=$(ibmcloud cs workers ${PIPELINE_KUBERNETES_CLUSTER_NAME} | grep normal | head -n 1 | awk '{ print $2 }') -if [ -z $IP_ADDR ]; then - echo "$PIPELINE_KUBERNETES_CLUSTER_NAME not created or workers not ready" - exit 1 -fi - -echo "Configuring cluster namespace" -if kubectl get namespace ${CLUSTER_NAMESPACE}; then - echo -e "Namespace ${CLUSTER_NAMESPACE} found." -else - kubectl create namespace ${CLUSTER_NAMESPACE} - echo -e "Namespace ${CLUSTER_NAMESPACE} created." -fi - -echo "Configuring cluster role binding" -if kubectl get clusterrolebinding kube-system:default; then - echo -e "Cluster role binding found." -else - kubectl create clusterrolebinding kube-system:default --clusterrole=cluster-admin --serviceaccount=kube-system:default - echo -e "Cluster role binding created." -fi - -echo "Configuring Tiller (Helm's server component)" -helm init --upgrade -kubectl rollout status -w deployment/tiller-deploy --namespace=kube-system -while [ "$(helm version | grep "Tiller")" != "" ]; do - echo "Waiting for server..." - sleep 10 -done -helm version - -echo "CHART_NAME: $CHART_NAME" - -echo "DEFINE RELEASE by prefixing image (app) name with namespace if not 'default' as Helm needs unique release names across namespaces" -if [[ "${CLUSTER_NAMESPACE}" != "default" ]]; then - RELEASE_NAME="${CLUSTER_NAMESPACE}-${IMAGE_NAME}" -else - RELEASE_NAME=${IMAGE_NAME} -fi -echo "RELEASE_NAME: $RELEASE_NAME" - -echo "CHECKING CHART (lint)" -helm lint chart/${CHART_NAME} - -IMAGE_REPOSITORY=${REGISTRY_URL}/${REGISTRY_NAMESPACE}/${IMAGE_NAME} - -# Using 'upgrade --install" for rolling updates. Note that subsequent updates will occur in the same namespace the release is currently deployed in, ignoring the explicit--namespace argument". -echo -e "Dry run into: ${PIPELINE_KUBERNETES_CLUSTER_NAME}/${CLUSTER_NAMESPACE}." -helm upgrade --install --debug --dry-run ${RELEASE_NAME} ./chart/${CHART_NAME} --set image.repository=${IMAGE_REPOSITORY},image.tag=${BUILD_NUMBER} --namespace ${CLUSTER_NAMESPACE} - -echo -e "Deploying into: ${PIPELINE_KUBERNETES_CLUSTER_NAME}/${CLUSTER_NAMESPACE}." -helm upgrade --install ${RELEASE_NAME} ./chart/${CHART_NAME} --set image.repository=${IMAGE_REPOSITORY},image.tag=${BUILD_NUMBER} --namespace ${CLUSTER_NAMESPACE} - -echo -e "CHECKING deployment status of release ${RELEASE_NAME} with image tag: ${BUILD_NUMBER}" -echo "" -for ITERATION in {1..30} -do - DATA=$( kubectl get pods --namespace ${CLUSTER_NAMESPACE} -a -l release=${RELEASE_NAME} -o json ) - NOT_READY=$( echo $DATA | jq '.items[].status.containerStatuses[] | select(.image=="'"${IMAGE_REPOSITORY}:${BUILD_NUMBER}"'") | select(.ready==false) ' ) - if [[ -z "$NOT_READY" ]]; then - echo -e "All pods are ready:" - echo $DATA | jq '.items[].status.containerStatuses[] | select(.image=="'"${IMAGE_REPOSITORY}:${BUILD_NUMBER}"'") | select(.ready==true) ' - break # deployment succeeded - fi - REASON=$(echo $DATA | jq '.items[].status.containerStatuses[] | select(.image=="'"${IMAGE_REPOSITORY}:${BUILD_NUMBER}"'") | .state.waiting.reason') - echo -e "${ITERATION} : Deployment still pending..." - echo -e "NOT_READY:${NOT_READY}" - echo -e "REASON: ${REASON}" - if [[ ${REASON} == *ErrImagePull* ]] || [[ ${REASON} == *ImagePullBackOff* ]]; then - echo "Detected ErrImagePull or ImagePullBackOff failure. " - echo "Please check proper authenticating to from cluster to image registry (e.g. image pull secret)" - break; # no need to wait longer, error is fatal - elif [[ ${REASON} == *CrashLoopBackOff* ]]; then - echo "Detected CrashLoopBackOff failure. " - echo "Application is unable to start, check the application startup logs" - break; # no need to wait longer, error is fatal - fi - sleep 5 -done - -if [[ ! -z "$NOT_READY" ]]; then - echo "" - echo "==========================================================" - echo "DEPLOYMENT FAILED" - echo "Deployed Services:" - kubectl describe services ${RELEASE_NAME}-${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} - echo "" - echo "Deployed Pods:" - kubectl describe pods --selector app=${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} - echo "" - echo "Application Logs" - kubectl logs --selector app=${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} - echo "==========================================================" - PREVIOUS_RELEASE=$( helm history ${RELEASE_NAME} | grep SUPERSEDED | sort -r -n | awk '{print $1}' | head -n 1 ) - echo -e "Could rollback to previous release: ${PREVIOUS_RELEASE} using command:" - echo -e "helm rollback ${RELEASE_NAME} ${PREVIOUS_RELEASE}" - # helm rollback ${RELEASE_NAME} ${PREVIOUS_RELEASE} - # echo -e "History for release:${RELEASE_NAME}" - # helm history ${RELEASE_NAME} - # echo "Deployed Services:" - # kubectl describe services ${RELEASE_NAME}-${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} - # echo "" - # echo "Deployed Pods:" - # kubectl describe pods --selector app=${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} - exit 1 -fi - -echo "" -echo "==========================================================" -echo "DEPLOYMENT SUCCEEDED" -echo "" -echo -e "Status for release:${RELEASE_NAME}" -helm status ${RELEASE_NAME} - -echo "" -echo -e "History for release:${RELEASE_NAME}" -helm history ${RELEASE_NAME} - -# echo "" -# echo "Deployed Services:" -# kubectl describe services ${RELEASE_NAME}-${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} -# echo "" -# echo "Deployed Pods:" -# kubectl describe pods --selector app=${CHART_NAME} --namespace ${CLUSTER_NAMESPACE} - -echo "==========================================================" -IP_ADDR=$(ibmcloud cs workers ${PIPELINE_KUBERNETES_CLUSTER_NAME} | grep normal | head -n 1 | awk '{ print $2 }') -PORT=$(kubectl get services --namespace ${CLUSTER_NAMESPACE} | grep ${RELEASE_NAME} | sed 's/[^:]*:\([0-9]*\).*/\1/g') -echo -e "View the application health at: http://${IP_ADDR}:${PORT}/health" diff --git a/.bluemix/toolchain.yml b/.bluemix/toolchain.yml deleted file mode 100644 index db9b0cf..0000000 --- a/.bluemix/toolchain.yml +++ /dev/null @@ -1,62 +0,0 @@ -version: '2' -template: - name: Continuous Delivery Toolchain - description: "This toolchain includes tools to develop and deploy your app. Depending on your app, when you create the toolchain, the GitHub repository will either be empty or will contain source code from your app.\n\nThis toolchain uses tools that are part of the Continuous Delivery service. If an instance of that service isn't already in your organization, when you click **Create**, it is automatically added at no cost to you. For more information and terms, see the [IBM Cloud catalog](/catalog/services/continuous-delivery/).\n\nTo get started, click **Create**." - required: - - repo - - build - -toolchain: - name: "{{form.pipeline.parameters.toolchain-name}}" - -services: - # Github repos - repo: - service_id: hostedgit - parameters: - repo_url: "{{#zip_url}}{{zip_url}}{{/zip_url}}{{^zip_url}}{{repository}}{{/zip_url}}" - repo_name: "{{toolchain.name}}" - type: clone - has_issues: true - enable_traceability: true - - # Pipelines - build: - service_id: pipeline - parameters: - services: - - repo - name: "{{form.pipeline.parameters.app-name}}" - ui-pipeline: true - configuration: - content: - $text: pipeline.yml - env: - REPO: repo - CF_APP: "{{form.pipeline.parameters.app-name}}" - API_KEY: "{{form.pipeline.parameters.api-key}}" - CF_SPACE: "{{form.pipeline.parameters.dev-space}}" - CF_ORGANIZATION: "{{form.pipeline.parameters.dev-organization}}" - CF_HOSTNAME: "{{form.pipeline.parameters.cf-host}}" - CF_DOMAIN: "{{form.pipeline.parameters.cf-domain}}" - REGION_ID: "{{form.pipeline.parameters.dev-region}}" - execute: true - - #Web IDE - webide: - service_id: orion - -#Deployment -form: - pipeline: - schema: - $ref: deploy.json - parameters: - app-name: "{{app-name}}" - toolchain-name: "{{toolchain-name}}" - dev-region: "{{deploymentRegion}}" - api-key: "{{api-key}}" - dev-space: "{{deploymentSpace}}" - dev-organization: "{{deploymentOrg}}" - cf-host: "{{cf-host}}" - cf-domain: "{{cf-domain}}" From 1fb664abe1fe688219602b87bfc50fa64662a4f8 Mon Sep 17 00:00:00 2001 From: Christian Compton Date: Fri, 8 Mar 2019 13:05:20 -0600 Subject: [PATCH 17/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 12e37d6..08e4610 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ To use iterative development: You can deploy your application to IBM Cloud using the CloudFoundry CLI. You can deploy the application to IBM Cloud using the CloudFoundry command-line: -1. Install the Cloud Foundry command-line (https://docs.cloudfoundry.org/cf-cli/install-go-cli.html) +1. Install the [Cloud Foundry command-line](https://docs.cloudfoundry.org/cf-cli/install-go-cli.html) 1. Ensure all configured services have been provisioned 1. Run `cf push` from the project root directory From 6e3ed656f390b3dc0263f0d1b5a76b3e825ed32d Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Tue, 26 Mar 2019 21:22:42 +0000 Subject: [PATCH 18/30] Automated Update --- .swift-version | 2 +- .yo-rc.json | 2 +- chart/swiftkiturahyperprotectdbaas/Chart.yaml | 4 -- .../bindings.yaml | 38 ---------------- .../templates/basedeployment.yaml | 42 ------------------ .../templates/deployment.yaml | 44 ------------------- .../templates/hpa.yaml | 27 ------------ .../templates/istio.yaml | 19 -------- .../templates/service.yaml | 15 ------- .../swiftkiturahyperprotectdbaas/values.yaml | 39 ---------------- 10 files changed, 2 insertions(+), 230 deletions(-) delete mode 100644 chart/swiftkiturahyperprotectdbaas/Chart.yaml delete mode 100644 chart/swiftkiturahyperprotectdbaas/bindings.yaml delete mode 100644 chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml delete mode 100644 chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml delete mode 100644 chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml delete mode 100644 chart/swiftkiturahyperprotectdbaas/templates/istio.yaml delete mode 100644 chart/swiftkiturahyperprotectdbaas/templates/service.yaml delete mode 100644 chart/swiftkiturahyperprotectdbaas/values.yaml diff --git a/.swift-version b/.swift-version index af8c8ec..f2c6cb6 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -4.2.2 +4.2.3 diff --git a/.yo-rc.json b/.yo-rc.json index 7927b93..f43579b 100644 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -1,5 +1,5 @@ { "generator-swiftserver": { - "version": "5.12.0" + "version": "5.12.1" } } \ No newline at end of file diff --git a/chart/swiftkiturahyperprotectdbaas/Chart.yaml b/chart/swiftkiturahyperprotectdbaas/Chart.yaml deleted file mode 100644 index d081639..0000000 --- a/chart/swiftkiturahyperprotectdbaas/Chart.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -description: A Helm chart for Kubernetes -name: swiftkiturahyperprotectdbaas -version: 1.0.0 \ No newline at end of file diff --git a/chart/swiftkiturahyperprotectdbaas/bindings.yaml b/chart/swiftkiturahyperprotectdbaas/bindings.yaml deleted file mode 100644 index 4e5f473..0000000 --- a/chart/swiftkiturahyperprotectdbaas/bindings.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# This file is included in-line in the env section of deployment.yaml -# if .Values.generatedBindings.enabled is true. -- name: IBM_APM_SERVER_URL - valueFrom: - secretKeyRef: - name: apm-server-config - key: ibm_apm_server_url - optional: true -- name: IBM_APM_KEYFILE - valueFrom: - secretKeyRef: - name: apm-server-config - key: ibm_apm_keyfile - optional: true -- name: IBM_APM_KEYFILE_PASSWORD - valueFrom: - secretKeyRef: - name: apm-server-config - key: ibm_apm_keyfile_password - optional: true -- name: IBM_APM_INGRESS_URL - valueFrom: - secretKeyRef: - name: apm-server-config - key: ibm_apm_ingress_url - optional: true -- name: IBM_APM_ACCESS_TOKEN - valueFrom: - secretKeyRef: - name: apm-server-config - key: ibm_apm_access_token - optional: true -- name: service_hypersecure_dbaas_mongodb - valueFrom: - secretKeyRef: - name: binding-hypersecuredbServiceName - key: binding - optional: true diff --git a/chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml b/chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml deleted file mode 100644 index 82c2f12..0000000 --- a/chart/swiftkiturahyperprotectdbaas/templates/basedeployment.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{ if .Values.base.enabled }} -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: "{{ .Chart.Name }}-basedeployment" - labels: - chart: '{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}' -spec: - replicas: {{ .Values.base.replicaCount }} - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 0 - maxSurge: 1 - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - template: - metadata: - labels: - app: "{{ .Chart.Name }}-selector" - version: "base" - spec: - containers: - - name: "{{ .Chart.Name }}" - image: "{{ .Values.image.repository }}:{{ .Values.base.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - livenessProbe: - httpGet: - path: /health - port: {{ .Values.service.servicePort }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds}} - periodSeconds: {{ .Values.livenessProbe.periodSeconds}} - resources: - requests: - cpu: "{{ .Values.image.resources.requests.cpu }}" - memory: "{{ .Values.image.resources.requests.memory }}" - env: - - name: PORT - value : "{{ .Values.service.servicePort }}" -{{- if .Values.generatedBindings.enabled }} -{{.Files.Get "bindings.yaml" | indent 10 }} -{{- end }} -{{ end }} diff --git a/chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml b/chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml deleted file mode 100644 index 542b2db..0000000 --- a/chart/swiftkiturahyperprotectdbaas/templates/deployment.yaml +++ /dev/null @@ -1,44 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: "{{ .Chart.Name }}-deployment" - labels: - chart: '{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}' -spec: - replicas: {{ .Values.replicaCount }} - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 0 - maxSurge: 1 - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - template: - metadata: - labels: - app: "{{ .Chart.Name }}-selector" - version: "current" - spec: - containers: - - name: "{{ .Chart.Name }}" - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - livenessProbe: - httpGet: - path: /health - port: {{ .Values.service.servicePort }} - initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds}} - periodSeconds: {{ .Values.livenessProbe.periodSeconds}} - ports: - - containerPort: {{ .Values.service.servicePort}} - resources: - requests: - cpu: "{{ .Values.image.resources.requests.cpu }}" - memory: "{{ .Values.image.resources.requests.memory }}" - env: - - name: PORT - value : "{{ .Values.service.servicePort }}" - - name: APPLICATION_NAME - value: "{{ .Release.Name }}" -{{- if .Values.generatedBindings.enabled }} -{{.Files.Get "bindings.yaml" | indent 10 }} -{{- end }} diff --git a/chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml b/chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml deleted file mode 100644 index 5fdefe9..0000000 --- a/chart/swiftkiturahyperprotectdbaas/templates/hpa.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.hpa.enabled }} -{{ if and (eq .Capabilities.KubeVersion.Major "1") (ge .Capabilities.KubeVersion.Minor "8") }} -apiVersion: autoscaling/v2beta1 -{{ else }} -apiVersion: autoscaling/v2alpha1 -{{ end }} -kind: HorizontalPodAutoscaler -metadata: - name: "{{ .Chart.Name }}-hpa-policy" - namespace: default -spec: - scaleTargetRef: - apiVersion: apps/v1beta1 - kind: Deployment - name: "{{ .Chart.Name }}-deployment" - minReplicas: {{ .Values.hpa.minReplicas }} - maxReplicas: {{ .Values.hpa.maxReplicas }} - metrics: - - type: Resource - resource: - name: cpu - targetAverageUtilization: {{ .Values.hpa.metrics.cpu.targetAverageUtilization }} - - type: Resource - resource: - name: memory - targetAverageUtilization: {{ .Values.hpa.metrics.memory.targetAverageUtilization }} -{{ end }} \ No newline at end of file diff --git a/chart/swiftkiturahyperprotectdbaas/templates/istio.yaml b/chart/swiftkiturahyperprotectdbaas/templates/istio.yaml deleted file mode 100644 index 7ee841b..0000000 --- a/chart/swiftkiturahyperprotectdbaas/templates/istio.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{ if .Values.istio.enabled }} -apiVersion: config.istio.io/v1alpha2 -kind: RouteRule -metadata: - name: "{{ .Chart.Name }}-default" -spec: - destination: - name: "{{ .Chart.Name }}-service" - precedence: 1 - route: - - labels: - version: "current" - weight: {{ .Values.istio.weight }} -{{ if .Values.base.enabled }} - - labels: - version: "base" - weight: {{ .Values.base.weight }} -{{ end }} -{{ end }} \ No newline at end of file diff --git a/chart/swiftkiturahyperprotectdbaas/templates/service.yaml b/chart/swiftkiturahyperprotectdbaas/templates/service.yaml deleted file mode 100644 index 22c89ca..0000000 --- a/chart/swiftkiturahyperprotectdbaas/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - annotations: - prometheus.io/scrape: 'true' - name: "{{ .Chart.Name }}-application-service" - labels: - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" -spec: - type: {{ .Values.service.type }} - ports: - - name: http - port: {{ .Values.service.servicePort }} - selector: - app: "{{ .Chart.Name }}-selector" diff --git a/chart/swiftkiturahyperprotectdbaas/values.yaml b/chart/swiftkiturahyperprotectdbaas/values.yaml deleted file mode 100644 index 3fb2fe7..0000000 --- a/chart/swiftkiturahyperprotectdbaas/values.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. -replicaCount: 1 -revisionHistoryLimit: 1 -image: - repository: icr.io/replace-me-namespace/swiftkiturahyperprotectdbaas - tag: v1.0.0 - pullPolicy: Always - resources: - requests: - cpu: 200m - memory: 300Mi -livenessProbe: - initialDelaySeconds: 30 - periodSeconds: 10 -service: - name: swift - type: NodePort - servicePort: 8080 -hpa: - enabled: false - minReplicas: 1 - maxReplicas: 2 - metrics: - cpu: - targetAverageUtilization: 70 - memory: - targetAverageUtilization: 70 -base: - enabled: false - replicaCount: 1 - image: - tag : v0.9.9 - weight: 100 -istio: - enabled: false - weight: 100 -generatedBindings: - enabled: true From 5b9f7b26a18c8dd7ca2ae5d6a13003285e0d6f41 Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Thu, 4 Apr 2019 14:24:15 +0000 Subject: [PATCH 19/30] Automated Update --- NOTICES.txt | 328 ++++++++++++++++++++++++---------------------------- 1 file changed, 150 insertions(+), 178 deletions(-) diff --git a/NOTICES.txt b/NOTICES.txt index 9ad6387..2f6eb6e 100644 --- a/NOTICES.txt +++ b/NOTICES.txt @@ -1,178 +1,150 @@ -Swagger-UI: - - -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - +Swagger-UI: +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. \ No newline at end of file From 2c34552b0dce760bef042c91fb733cdb997e3637 Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Thu, 18 Apr 2019 15:22:05 +0000 Subject: [PATCH 20/30] [ImgBot] Optimize images *Total -- 27.60kb -> 23.88kb (13.48%) /public/explorer/images/explorer_icons.png -- 5.00kb -> 2.94kb (41.19%) /images/architecture-bff.png -- 22.61kb -> 20.94kb (7.36%) --- images/architecture-bff.png | Bin 23151 -> 21447 bytes public/explorer/images/explorer_icons.png | Bin 5115 -> 3008 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/images/architecture-bff.png b/images/architecture-bff.png index 0336c75432acaed950833b1028808f2bb9da8119..7527b08592720d0b6640b4bc2bbf36cce60c1a3f 100644 GIT binary patch literal 21447 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

5o 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

{gX#(6Cc#qxCDb5L<_W5=Sleo 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 NHgJ2Zx^sT1{{S|-U$FoH literal 23151 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 I!JdTtAI=+^)&Kwi From 2e201fbb3a14f67aa058649d3a8b34eb3a1cb643 Mon Sep 17 00:00:00 2001 From: IBM Developer Experience Date: Fri, 31 May 2019 16:46:58 +0000 Subject: [PATCH 21/30] Automated Update --- Dockerfile | 2 +- Dockerfile-tools | 2 +- Package.swift | 2 +- .../Application/Services/ServiceHypersecureDbaasMongodb.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7c9a871..e45bf0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu-runtime:4.2.3 +FROM ibmcom/swift-ubuntu-runtime:5.0.1 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu-runtime image." diff --git a/Dockerfile-tools b/Dockerfile-tools index 53630d7..bc02028 100644 --- a/Dockerfile-tools +++ b/Dockerfile-tools @@ -1,4 +1,4 @@ -FROM ibmcom/swift-ubuntu:4.2.3 +FROM ibmcom/swift-ubuntu:5.0.1 LABEL maintainer="IBM Swift Engineering at IBM Cloud" LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu image." diff --git a/Package.swift b/Package.swift index ebf2149..72a0d59 100644 --- a/Package.swift +++ b/Package.swift @@ -9,7 +9,7 @@ let package = Package( .package(url: "https://github.com/IBM-Swift/CloudEnvironment.git", from: "9.0.0"), .package(url: "https://github.com/RuntimeTools/SwiftMetrics.git", from: "2.0.0"), .package(url: "https://github.com/IBM-Swift/Health.git", from: "1.0.0"), - .package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "4.0.0"), + .package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "5.1.11"), ], targets: [ .target(name: "swiftkiturahyperprotectdbaas", dependencies: [ .target(name: "Application"), "Kitura" , "HeliumLogger"]), diff --git a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift index 8b6fb41..a2391ac 100644 --- a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift +++ b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift @@ -11,7 +11,7 @@ func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> Data let mongodbUri = mongodbCredentials.uri.components(separatedBy: "?")[0] let mongodbSsl = mongodbUri + "?ssl=true&ssl_ca_certs=/Sources/Application/Services/cert.pem" - let mongodb = try Database(mongodbSsl) + let mongodb = try Database.synchronousConnect(mongodbSsl) Log.info("Found and loaded credentials for HyperSecure MongoDB.") return mongodb } From 1f2be91a220ee0bfff6a665d8e91e2f677e6e7d0 Mon Sep 17 00:00:00 2001 From: Christian Compton Date: Tue, 11 Jun 2019 14:16:14 -0500 Subject: [PATCH 22/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08e4610..0a9b3ba 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ When you push your application to IBM Cloud, these values are no longer used, in ### Iterative Development -The `iterative-dev.sh` script is included in the root of the generated Swift project and allows for fast & easy iterations for the developer. Instead of stopping the running Kitura server to see new code changes, while the script is running, it will automatically detect changes in the project's **.swift** files and recompile the app accordingly. +The `iterative-dev.sh` script is included in the root of the generated Swift project and allows for fast and easy iterations for the developer. Instead of stopping the running Kitura server to see new code changes, while the script is running, it will automatically detect changes in the project's **.swift** files and recompile the app accordingly. To use iterative development: * For native OS, execute the `./iterative-dev.sh` script from the root of the project. From 80a95096a0526ee9645fb74bdc1e3080515040db Mon Sep 17 00:00:00 2001 From: jpkessle Date: Fri, 5 Jul 2019 09:04:55 -0500 Subject: [PATCH 23/30] Light edit and topicID link updates. (#23) https://github.ibm.com/arf/planning-languages/issues/859 https://github.ibm.com/Bluemix/docs/issues/4724 --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0a9b3ba..c7c6997 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@ In this code pattern, you will create a server-side application using [Kitura](h When you have completed this code pattern, you will understand how to: -* Provision and integrate Hyper Protect Services -* Generate an application with files for deploying to Kubernetes, Cloud Foundry or a DevOps Pipeline -* Generate an application with files for monitoring and distributed trace using App Metrics -* Connect to additional provisioned services +* Provision and integrate Hyper Protect Services. +* Generate an application with files for deploying to Kubernetes, Cloud Foundry or a DevOps Pipeline. +* Generate an application with files for monitoring and distributed trace using App Metrics. +* Connect to additional provisioned services. ![](images/architecture-bff.png) @@ -64,7 +64,7 @@ Your application configuration information for any services is stored in the `lo The application uses the [CloudEnvironment package](https://github.com/IBM-Swift/CloudEnvironment) to read the connection and configuration information from the environment and this file. It uses `mappings.json`, found in the `config` directory, to communicate where the credentials can be found for each service. -If the application is running locally, it can connect to IBM Cloud services using unbound credentials read from this file. If you need to create unbound credentials you can do so from the IBM Cloud web console ([example](https://cloud.ibm.com/docs/services/Cloudant/tutorials/create_service.html#creating-a-service-instance)), or using the CloudFoundry CLI [`cf create-service-key` command](https://cli.cloudfoundry.org/en-US/cf/create-service-key.html). +If the application is running locally, it can connect to IBM Cloud services using unbound credentials read from this file. If you need to create unbound credentials you can do so from the IBM Cloud web console ([example](https://cloud.ibm.com/docs/services/Cloudant/tutorials?topic=cloudant-creating-an-ibm-cloudant-instance-on-ibm-cloud)), or using the Cloud Foundry CLI [`cf create-service-key` command](https://cli.cloudfoundry.org/en-US/cf/create-service-key.html). When you push your application to IBM Cloud, these values are no longer used, instead the application automatically connects to bound services using environment variables. @@ -78,14 +78,14 @@ To use iterative development: ## Deploy to IBM Cloud -You can deploy your application to IBM Cloud using the CloudFoundry CLI. +You can deploy your application to IBM Cloud using the Cloud Foundry CLI. -You can deploy the application to IBM Cloud using the CloudFoundry command-line: +You can deploy the application to IBM Cloud using the Cloud Foundry command-line: 1. Install the [Cloud Foundry command-line](https://docs.cloudfoundry.org/cf-cli/install-go-cli.html) 1. Ensure all configured services have been provisioned 1. Run `cf push` from the project root directory -The Cloud Foundry CLI will not provision the configured services for you, so you will need to do this manually using the IBM Cloud web console ([example](https://cloud.ibm.com/docs/services/Cloudant/tutorials/create_service.html#creating-a-service-instance)) or the CloudFoundry CLI (`cf create-service` command)[http://cli.cloudfoundry.org/en-US/cf/create-service.html]. The service names and types will need to match your [configuration](#configuration). +The Cloud Foundry CLI will not provision the configured services for you, so you will need to do this manually using the IBM Cloud web console ([example](https://cloud.ibm.com/docs/services/Cloudant/tutorials?topic=cloudant-creating-an-ibm-cloudant-instance-on-ibm-cloud)) or the CloudFoundry CLI (`cf create-service` command)[http://cli.cloudfoundry.org/en-US/cf/create-service.html]. The service names and types will need to match your [configuration](#configuration). ## Service descriptions @@ -122,7 +122,7 @@ The application includes the following files for Docker support: * `Dockerfile` * `Dockerfile-tools` -The `.dockerignore` file contains the files/directories that should not be included in the built docker image. By default this file contains the `Dockerfile` and `Dockerfile-tools`. It can be modified as required. +The `.dockerignore` file contains the files/directories that should not be included in the built docker image. By default, this file contains the `Dockerfile` and `Dockerfile-tools`. It can be modified as required. The `Dockerfile` defines the specification of the default docker image for running the application. This image can be used to run the application. @@ -141,7 +141,7 @@ The [`manifest.yml`](https://cloud.ibm.com/docs/manageapps/depapps.html#appmanif ## Next steps -Leverage the [IBM Cloud DevOps](https://cloud.ibm.com/docs/services/ContinuousDelivery/index.html) service, which provides toolchains as a set of tool integrations that support development, deployment, and operations tasks inside IBM Cloud, for both Cloud Foundry and Kubernetes applications. +Leverage the [IBM Cloud DevOps](https://cloud.ibm.com/docs/services/ContinuousDelivery?topic=ContinuousDelivery-getting-started) service, which provides toolchains as a set of tool integrations that support development, deployment, and operations tasks inside IBM Cloud, for both Cloud Foundry and Kubernetes applications. ## License From 5c6f4aad10f6995d4fd6737e8d35e764bc27f788 Mon Sep 17 00:00:00 2001 From: Elton de Souza Date: Wed, 2 Oct 2019 17:34:25 -0400 Subject: [PATCH 24/30] Upgrade to MongoKitten 6.0 --- .gitignore | 5 ++- Package.swift | 2 +- Sources/Application/Application.swift | 2 +- Sources/Application/Routes/AppRoutes.swift | 14 +++--- .../Application/Routes/Products_Routes.swift | 44 ++++++++++++------- .../ServiceHypersecureDbaasMongodb.swift | 4 +- 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index c46c69a..f4f71a9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,7 @@ credentials.json config.json spec.json localdev-config.json -config/localdev-config.json \ No newline at end of file +config/localdev-config.json +swiftkiturahyperprotectdbaas.xcodeproj/* +.history +Package.resolved diff --git a/Package.swift b/Package.swift index 72a0d59..561d20b 100644 --- a/Package.swift +++ b/Package.swift @@ -9,7 +9,7 @@ let package = Package( .package(url: "https://github.com/IBM-Swift/CloudEnvironment.git", from: "9.0.0"), .package(url: "https://github.com/RuntimeTools/SwiftMetrics.git", from: "2.0.0"), .package(url: "https://github.com/IBM-Swift/Health.git", from: "1.0.0"), - .package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "5.1.11"), + .package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "6.0.0"), ], targets: [ .target(name: "swiftkiturahyperprotectdbaas", dependencies: [ .target(name: "Application"), "Kitura" , "HeliumLogger"]), diff --git a/Sources/Application/Application.swift b/Sources/Application/Application.swift index 3c9d21a..a834c50 100644 --- a/Sources/Application/Application.swift +++ b/Sources/Application/Application.swift @@ -14,7 +14,7 @@ public let health = Health() class ApplicationServices { // Initialize services - public let mongoDBService: MongoKitten.Database + public let mongoDBService: MongoKitten.MongoDatabase public init(cloudEnv: CloudEnv) throws { // Run service initializers diff --git a/Sources/Application/Routes/AppRoutes.swift b/Sources/Application/Routes/AppRoutes.swift index 9d328a9..ab5c1f7 100644 --- a/Sources/Application/Routes/AppRoutes.swift +++ b/Sources/Application/Routes/AppRoutes.swift @@ -17,7 +17,7 @@ class SupplementalMongoController { fileprivate let router: Router // The mongo database - fileprivate let database: Database + fileprivate let database: MongoDatabase // The name of the database collection fileprivate let collectionName: String @@ -34,7 +34,7 @@ class SupplementalMongoController { self.database = app.services.mongoDBService // Create the collection if necessary - let _ = try? database.createCollection(named: collectionName) + let _ = database[collectionName] } // Method to register routes @@ -72,11 +72,11 @@ extension SupplementalMongoController { do { // Create MongoKitten ID - let _id = try ObjectId(id) + let _id = ObjectId(id) // Update Document with ID - let result = try collection.update("_id" == _id, to: document) + let result = try collection.updateOne(where : "_id" == _id, to: document).wait() // Send appropriate result - if result == 1 { + if result.updatedCount == 1 { try response.send(json: document).end() } else { try response.status(.notFound).end() @@ -117,7 +117,7 @@ extension SupplementalMongoController { fileprivate func deleteAll(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { do { // Remove all items from the collection - try collection.remove() + collection.drop() // Send success response try response.status(.OK).end() } catch { @@ -129,7 +129,7 @@ extension SupplementalMongoController { // Helper method to convert json to MongoKitten Document fileprivate func convert(json: Data) -> Document? { guard let jsonStr = String(data: json, encoding: .utf8), - let doc = try? Document(extendedJSON: jsonStr) else { + let doc = try? Document(arrayLiteral: jsonStr) else { return nil } return doc diff --git a/Sources/Application/Routes/Products_Routes.swift b/Sources/Application/Routes/Products_Routes.swift index 365141e..5f1c500 100644 --- a/Sources/Application/Routes/Products_Routes.swift +++ b/Sources/Application/Routes/Products_Routes.swift @@ -17,7 +17,7 @@ class MongoController { fileprivate let router: Router // The mongo database - fileprivate let database: Database + fileprivate let database: MongoDatabase // The name of the database collection fileprivate let collectionName: String @@ -34,7 +34,7 @@ class MongoController { self.database = app.services.mongoDBService // Create the collection if necessary - let _ = try? database.createCollection(named: collectionName) + let _ = database[collectionName] } // Method to register routes @@ -56,10 +56,12 @@ extension MongoController { fileprivate func getAll(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { do { // Finds the items in the collection and convert it to a json object - let items = try collection.find() - .makeDocument() - .makeExtendedJSONString() + let items = try collection.find().allResults().wait() + + //.makeDocument() + //.makeExtendedJSONString() + // edFixMe : this returns bson but incorrectly marked as json, find BSON -> JSON for bson 7.0 // Send success response response.headers.setType("json") try response.send(items).end() @@ -79,17 +81,24 @@ extension MongoController { do { // Create MongoKitten ID - let _id = try ObjectId(id) + let _id = ObjectId(id) // Find item in database - guard let item = try collection.findOne("_id" == _id)?.makeExtendedJSONString() else { + guard let item = try collection.findOne("_id" == _id).wait() + else { try response.send(status: .notFound).end() return } - // Send success response - response.headers.setType("json") - try response.send(item).end() + // edFixMe : figure out BSON to JSON conversion in BSON 7 + response.headers.setType("json") + try response.send(item).end() + + // makeExtendedJSONString() else { +// try response.send(status: .notFound).end() +// return +// } + } catch { response.status(.internalServerError) Log.error("Error: Unable to retrieve object from the database") @@ -153,15 +162,16 @@ extension MongoController { do { // Create MongoKitten ID - let _id = try ObjectId(id) + let _id = ObjectId(id) // Update Document with ID - let result = try collection.update("_id" == _id, to: document) + let result = try collection.updateOne(where: "_id" == _id, to: document).wait() // Send appropriate result - if result == 1 { + if result.updatedCount == 1 { try response.send(json: document).end() } else { try response.status(.notFound).end() } + try response.status(.notFound).end() } catch { response.status(.internalServerError) @@ -181,11 +191,11 @@ extension MongoController { do { // Create MongoKitten ID - let _id = try ObjectId(id) + let _id = ObjectId(id) // Remove item from collection - let result = try collection.remove("_id" == _id, limitedTo: 1) + let result = try collection.deleteOne(where: "_id" == _id).wait() // Create response code - let status: HTTPStatusCode = result == 1 ? .OK : .notFound + let status: HTTPStatusCode = result.ok > 0 ? .OK : .notFound // Send response try response.send(status: status).end() } catch { @@ -210,7 +220,7 @@ extension MongoController { // Helper method to convert json to MongoKitten Document fileprivate func convert(json: Data) -> Document? { guard let jsonStr = String(data: json, encoding: .utf8), - let doc = try? Document(extendedJSON: jsonStr) else { + let doc = try? Document(arrayLiteral: jsonStr) else { return nil } return doc diff --git a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift index a2391ac..fe97242 100644 --- a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift +++ b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift @@ -2,7 +2,7 @@ import LoggerAPI import CloudEnvironment import MongoKitten -func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> Database { +func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> MongoDatabase { guard let mongodbCredentials = cloudEnv.getHyperSecureDBaaSCredentials(name: "hypersecure_dbaas_mongodb") else { throw InitializationError("Could not load credentials for HyperSecure MongoDB.") } @@ -11,7 +11,7 @@ func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> Data let mongodbUri = mongodbCredentials.uri.components(separatedBy: "?")[0] let mongodbSsl = mongodbUri + "?ssl=true&ssl_ca_certs=/Sources/Application/Services/cert.pem" - let mongodb = try Database.synchronousConnect(mongodbSsl) + let mongodb = try MongoDatabase.synchronousConnect(mongodbSsl) Log.info("Found and loaded credentials for HyperSecure MongoDB.") return mongodb } From 19bc002475d774773bf862bbd2c35bbbbddb39af Mon Sep 17 00:00:00 2001 From: Elton de Souza Date: Wed, 2 Oct 2019 17:46:47 -0400 Subject: [PATCH 25/30] Update to Swift 5 --- Package.swift | 2 +- README.md | 6 +++++- Sources/Application/Routes/Products_Routes.swift | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Package.swift b/Package.swift index 561d20b..e098864 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.0 +// swift-tools-version:5.0 import PackageDescription let package = Package( diff --git a/README.md b/README.md index c7c6997..60d415b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,11 @@ This application has been generated with the following capabilities and services ## Requirements -* [Swift 4](https://swift.org/download/) +* [Swift 5](https://swift.org/download/) + +## To modify in XCode + +`swift package generate-xcodeproj` ## Run diff --git a/Sources/Application/Routes/Products_Routes.swift b/Sources/Application/Routes/Products_Routes.swift index 5f1c500..1b06962 100644 --- a/Sources/Application/Routes/Products_Routes.swift +++ b/Sources/Application/Routes/Products_Routes.swift @@ -124,7 +124,7 @@ extension MongoController { do { // Insert into database - try collection.insert(document) + collection.insert(document) // Send success response response.status(.created) From b75a99e20e6d35bc1e97d04c8e2de2db343297fa Mon Sep 17 00:00:00 2001 From: Elton de Souza Date: Thu, 17 Oct 2019 01:37:29 -0400 Subject: [PATCH 26/30] Swap MongoKitten with official MongoSwift --- Package.swift | 5 +- Sources/Application/Application.swift | 6 +- Sources/Application/Routes/AppRoutes.swift | 109 ++++++------ .../Application/Routes/Products_Routes.swift | 155 +++++++++--------- .../ServiceHypersecureDbaasMongodb.swift | 14 +- 5 files changed, 151 insertions(+), 138 deletions(-) diff --git a/Package.swift b/Package.swift index e098864..446e8fe 100644 --- a/Package.swift +++ b/Package.swift @@ -9,12 +9,11 @@ let package = Package( .package(url: "https://github.com/IBM-Swift/CloudEnvironment.git", from: "9.0.0"), .package(url: "https://github.com/RuntimeTools/SwiftMetrics.git", from: "2.0.0"), .package(url: "https://github.com/IBM-Swift/Health.git", from: "1.0.0"), - .package(url: "https://github.com/OpenKitten/MongoKitten.git", from: "6.0.0"), + .package(url: "https://github.com/mongodb/mongo-swift-driver.git", .branch("master")), ], targets: [ .target(name: "swiftkiturahyperprotectdbaas", dependencies: [ .target(name: "Application"), "Kitura" , "HeliumLogger"]), - .target(name: "Application", dependencies: [ "Kitura", "CloudEnvironment","SwiftMetrics", "Health", "MongoKitten", - + .target(name: "Application", dependencies: [ "Kitura", "CloudEnvironment","SwiftMetrics", "Health", "MongoSwift", ]), .testTarget(name: "ApplicationTests" , dependencies: [.target(name: "Application"), "Kitura","HeliumLogger" ]) diff --git a/Sources/Application/Application.swift b/Sources/Application/Application.swift index a834c50..e3b964b 100644 --- a/Sources/Application/Application.swift +++ b/Sources/Application/Application.swift @@ -7,18 +7,18 @@ import KituraContracts import Health // Service imports -import MongoKitten +import MongoSwift public let projectPath = ConfigurationManager.BasePath.project.path public let health = Health() class ApplicationServices { // Initialize services - public let mongoDBService: MongoKitten.MongoDatabase + public let mongoDBClientService: SyncMongoClient public init(cloudEnv: CloudEnv) throws { // Run service initializers - mongoDBService = try initializeServiceHypersecureDbaasMongodb(cloudEnv: cloudEnv) + mongoDBClientService = try initializeServiceHypersecureDbaasMongodb(cloudEnv: cloudEnv) } } diff --git a/Sources/Application/Routes/AppRoutes.swift b/Sources/Application/Routes/AppRoutes.swift index ab5c1f7..38ca5df 100644 --- a/Sources/Application/Routes/AppRoutes.swift +++ b/Sources/Application/Routes/AppRoutes.swift @@ -1,42 +1,49 @@ import Kitura import KituraNet import KituraContracts -import MongoKitten +import MongoSwift import LoggerAPI import Foundation func initializeAppRoutes(app: App) { let collectionName = "products" - let controller = SupplementalMongoController(app: app, collectionName: collectionName) + let databaseName = "productsDB" + let controller = SupplementalMongoController(app: app, collectionName: collectionName, databaseName: databaseName) controller.registerRoutes() } class SupplementalMongoController { - + // The application router fileprivate let router: Router - + // The mongo database - fileprivate let database: MongoDatabase - + fileprivate let databaseName: String + fileprivate let database: SyncMongoDatabase + // The name of the database collection fileprivate let collectionName: String - + // Mongo collection - fileprivate var collection: MongoCollection { - return database[collectionName] + fileprivate var collection: SyncMongoCollection { + return database.collection(collectionName) } - + // Initializer - public init(app: App, collectionName: String) { + public init(app: App, collectionName: String, databaseName : String) { self.router = app.router self.collectionName = collectionName - self.database = app.services.mongoDBService + self.databaseName = databaseName; + self.database = app.services.mongoDBClientService.db(databaseName) // Create the collection if necessary - let _ = database[collectionName] + do { + _ = try database.listCollectionNames().contains(collectionName) ? database.collection(collectionName) : database.createCollection(collectionName) + } catch { + Log.error("Error : Could not create or access collection : \(collectionName)") + } } - + // Method to register routes public func registerRoutes() { router.patch("/\(collectionName)/:id", handler: update) @@ -54,7 +61,7 @@ extension SupplementalMongoController { Log.error("Expected parameter: `id`") return } - + // Read in the request body var data = Data() guard let _ = try? request.read(into: &data) else { @@ -62,62 +69,62 @@ extension SupplementalMongoController { Log.error("No body found in request") return } - + // Convert json data to MongoKitten Document guard let document = convert(json: data) else { try response.status(.badRequest).end() Log.error("Body contains invalid JSON") return } - + do { // Create MongoKitten ID let _id = ObjectId(id) // Update Document with ID - let result = try collection.updateOne(where : "_id" == _id, to: document).wait() + let result = try collection.updateOne(filter : ["_id": _id?.hex ?? ""], update: document) // Send appropriate result - if result.updatedCount == 1 { + if result?.upsertedCount == 1 { try response.send(json: document).end() } else { try response.status(.notFound).end() } - + } catch { response.status(.internalServerError) Log.error("Error: Unable to update object in the database") } } - + /*// Handler to delete the specified entry in the database - fileprivate func delete(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { - - // Retrieve ID route parameter - guard let id = request.parameters["id"] else { - try response.status(.badRequest).end() - Log.error("Expected parameter: `id`") - return - } - - do { - // Create MongoKitten ID - let _id = try ObjectId(id) - // Remove item from collection - let result = try collection.remove("_id" == _id, limitedTo: 1) - // Create response code - let status: HTTPStatusCode = result == 1 ? .OK : .notFound - // Send response - try response.send(status: status).end() - } catch { - response.status(.internalServerError) - Log.error("Error: Unable to remove object from the database") - } - }*/ - + fileprivate func delete(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { + + // Retrieve ID route parameter + guard let id = request.parameters["id"] else { + try response.status(.badRequest).end() + Log.error("Expected parameter: `id`") + return + } + + do { + // Create MongoKitten ID + let _id = try ObjectId(id) + // Remove item from collection + let result = try collection.remove("_id" == _id, limitedTo: 1) + // Create response code + let status: HTTPStatusCode = result == 1 ? .OK : .notFound + // Send response + try response.send(status: status).end() + } catch { + response.status(.internalServerError) + Log.error("Error: Unable to remove object from the database") + } + }*/ + // Handler to delete all entries in the database fileprivate func deleteAll(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { do { // Remove all items from the collection - collection.drop() + try collection.drop() // Send success response try response.status(.OK).end() } catch { @@ -125,13 +132,11 @@ extension SupplementalMongoController { Log.error("Error: Unable to remove objects from the database") } } - - // Helper method to convert json to MongoKitten Document + + // Helper method to convert json to Mongo Document fileprivate func convert(json: Data) -> Document? { - guard let jsonStr = String(data: json, encoding: .utf8), - let doc = try? Document(arrayLiteral: jsonStr) else { - return nil - } + //guard let jsonStr = String(data: json, encoding: .utf8), + let doc = try! Document(fromJSON: json) return doc } } diff --git a/Sources/Application/Routes/Products_Routes.swift b/Sources/Application/Routes/Products_Routes.swift index 1b06962..452f6fd 100644 --- a/Sources/Application/Routes/Products_Routes.swift +++ b/Sources/Application/Routes/Products_Routes.swift @@ -1,42 +1,58 @@ import Kitura import KituraNet import KituraContracts -import MongoKitten +import MongoSwift import LoggerAPI import Foundation func initializeProducts_Routes(app: App) { let collectionName = "products" - let controller = MongoController(app: app, collectionName: collectionName) + let databaseName = "productsDB" + let controller = MongoController(app: app, collectionName: collectionName, databaseName : databaseName) controller.registerRoutes() } -class MongoController { +/// A Codable type that matches the data in our Products in routes +private struct Product: Codable { + var name: String + var description: String +} +class MongoController { + // The application router fileprivate let router: Router - + + // The DB name (here, productsDB) + fileprivate let databaseName : String + // The mongo database - fileprivate let database: MongoDatabase - + fileprivate let database: SyncMongoDatabase + + // The name of the database collection fileprivate let collectionName: String - + // Mongo collection - fileprivate var collection: MongoCollection { - return database[collectionName] + fileprivate var collection: SyncMongoCollection { + return database.collection(collectionName, withType: Product.self) } - + // Initializer - public init(app: App, collectionName: String) { + public init(app: App, collectionName: String, databaseName : String) { self.router = app.router self.collectionName = collectionName - self.database = app.services.mongoDBService - + self.databaseName = databaseName + self.database = app.services.mongoDBClientService.db(databaseName) + // Create the collection if necessary - let _ = database[collectionName] + do { + let _ = try database.listCollectionNames().contains(collectionName) ? database.collection(collectionName) : database.createCollection(collectionName) + } catch { + Log.error("Error: Unable to add or access collection") + } } - + // Method to register routes public func registerRoutes() { router.get("/\(collectionName)/:id", handler: get) @@ -51,26 +67,22 @@ class MongoController { /// Extension containing route handlers extension MongoController { - + // Handler to retrieve all entries in the database fileprivate func getAll(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { do { // Finds the items in the collection and convert it to a json object - let items = try collection.find().allResults().wait() - - //.makeDocument() - //.makeExtendedJSONString() - - // edFixMe : this returns bson but incorrectly marked as json, find BSON -> JSON for bson 7.0 + let items = try collection.find() + // Send success response response.headers.setType("json") - try response.send(items).end() + try response.send(Array(items)).end() } catch { response.status(.internalServerError) Log.error("Error: Unable to retrieve objects from the database") } } - + // Handler to retrieve the specified entry in the database fileprivate func get(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { // Retrieve ID route paramter @@ -78,33 +90,28 @@ extension MongoController { try response.status(.badRequest).end() return } - + do { // Create MongoKitten ID - let _id = ObjectId(id) - + let _id = ObjectId(id)! + // Find item in database - guard let item = try collection.findOne("_id" == _id).wait() - else { - try response.send(status: .notFound).end() - return - } - // Send success response - // edFixMe : figure out BSON to JSON conversion in BSON 7 - response.headers.setType("json") - try response.send(item).end() + let item = try collection.find(["_id": _id]) - // makeExtendedJSONString() else { -// try response.send(status: .notFound).end() -// return +// else { +// response.status(.internalServerError) +// Log.error("Error: Object doesn't exist") // } + response.headers.setType("json") + try response.send(Array(item)).end() + } catch { response.status(.internalServerError) Log.error("Error: Unable to retrieve object from the database") } } - + // Handler to insert the specified entry in the database fileprivate func create(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { // Read in the request body @@ -115,27 +122,27 @@ extension MongoController { return } - // Convert json data to MongoKitten Document + // Convert json data to Mongo Swift Document guard let document = convert(json: data) else { try response.status(.badRequest).end() Log.error("Body contains invalid JSON") return } - + do { // Insert into database - collection.insert(document) - + try collection.insertOne(Product.init(name: document.keys[0] , description: document.values[0] as! String)) + // Send success response response.status(.created) try response.send(json: document).end() - + } catch { response.status(.internalServerError) Log.error("Error: Unable to insert object into database") } } - + // Handler to update the specified entry in the database fileprivate func update(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { // Retrieve ID route parameter @@ -144,7 +151,7 @@ extension MongoController { Log.error("Expected parameter: `id`") return } - + // Read in the request body var data = Data() guard let _ = try? request.read(into: &data) else { @@ -152,50 +159,50 @@ extension MongoController { Log.error("No body found in request") return } - + // Convert json data to MongoKitten Document guard let document = convert(json: data) else { try response.status(.badRequest).end() Log.error("Body contains invalid JSON") return } - + do { // Create MongoKitten ID - let _id = ObjectId(id) + let _id = ObjectId(id)! // Update Document with ID - let result = try collection.updateOne(where: "_id" == _id, to: document).wait() + let result = try collection.updateOne(filter: ["_id" == _id.hex], update: document) // Send appropriate result - if result.updatedCount == 1 { + if result?.upsertedCount == 1 { try response.send(json: document).end() } else { try response.status(.notFound).end() } try response.status(.notFound).end() - + } catch { response.status(.internalServerError) Log.error("Error: Unable to update object in the database") } } - - // Handler to delete the specified entry in the database + + // Handler to delete the specified entry in the database. Exists gracefully even if the entry doesn't exist fileprivate func delete(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { - + // Retrieve ID route parameter guard let id = request.parameters["id"] else { try response.status(.badRequest).end() Log.error("Expected parameter: `id`") return } - + do { // Create MongoKitten ID - let _id = ObjectId(id) + // _id = ObjectId(id)! // Remove item from collection - let result = try collection.deleteOne(where: "_id" == _id).wait() + let result = try collection.deleteOne(["_id" == id]) // Create response code - let status: HTTPStatusCode = result.ok > 0 ? .OK : .notFound + let status: HTTPStatusCode = result == nil ? .OK : .notFound // Send response try response.send(status: status).end() } catch { @@ -203,25 +210,25 @@ extension MongoController { Log.error("Error: Unable to remove object from the database") } } - + /*// Handler to delete all entries in the database - fileprivate func deleteAll(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { - do { - // Remove all items from the collection - try collection.remove() - // Send success response - try response.status(.OK).end() - } catch { - response.status(.internalServerError) - Log.error("Error: Unable to remove objects from the database") - } - }*/ - + fileprivate func deleteAll(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { + do { + // Remove all items from the collection + try collection.remove() + // Send success response + try response.status(.OK).end() + } catch { + response.status(.internalServerError) + Log.error("Error: Unable to remove objects from the database") + } + }*/ + // Helper method to convert json to MongoKitten Document fileprivate func convert(json: Data) -> Document? { guard let jsonStr = String(data: json, encoding: .utf8), let doc = try? Document(arrayLiteral: jsonStr) else { - return nil + return nil } return doc } diff --git a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift index fe97242..6604873 100644 --- a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift +++ b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift @@ -1,17 +1,19 @@ import LoggerAPI import CloudEnvironment -import MongoKitten +import MongoSwift +import Foundation -func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> MongoDatabase { +func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> SyncMongoClient { guard let mongodbCredentials = cloudEnv.getHyperSecureDBaaSCredentials(name: "hypersecure_dbaas_mongodb") else { - throw InitializationError("Could not load credentials for HyperSecure MongoDB.") + throw InitializationError("Could not load credentials for HyperProtect MongoDB.") } // Add SSL Certificate parameters let mongodbUri = mongodbCredentials.uri.components(separatedBy: "?")[0] - let mongodbSsl = mongodbUri + "?ssl=true&ssl_ca_certs=/Sources/Application/Services/cert.pem" - let mongodb = try MongoDatabase.synchronousConnect(mongodbSsl) - Log.info("Found and loaded credentials for HyperSecure MongoDB.") + let sslOpts = TLSOptions(allowInvalidHostnames: true, caFile: URL(string: "/Users/edesouza/Projects/swift-dbaas-test/kitura-dbaas/Sources/cert.pem"), pemFile: nil) + + let mongodb = try SyncMongoClient("mongodb://admin:Eiu1h1ao1919988@dbaas30.hyperp-dbaas.cloud.ibm.com:28020,dbaas31.hyperp-dbaas.cloud.ibm.com:28105,dbaas29.hyperp-dbaas.cloud.ibm.com:28090/admin", options: ClientOptions(serverMonitoring: true, tlsOptions: sslOpts)) + Log.info("Found and loaded credentials for HyperProtect MongoDB.") return mongodb } From 91446407d8bca39b58f9e7f349cb2f096d34c5e6 Mon Sep 17 00:00:00 2001 From: Elton de Souza Date: Thu, 17 Oct 2019 13:29:01 -0400 Subject: [PATCH 27/30] Fixes for get/post/delete. put still broken. --- Sources/Application/Routes/AppRoutes.swift | 2 +- .../Application/Routes/Products_Routes.swift | 74 +++++-------------- .../ServiceHypersecureDbaasMongodb.swift | 8 +- 3 files changed, 25 insertions(+), 59 deletions(-) diff --git a/Sources/Application/Routes/AppRoutes.swift b/Sources/Application/Routes/AppRoutes.swift index 38ca5df..efa2609 100644 --- a/Sources/Application/Routes/AppRoutes.swift +++ b/Sources/Application/Routes/AppRoutes.swift @@ -76,7 +76,7 @@ extension SupplementalMongoController { Log.error("Body contains invalid JSON") return } - + do { // Create MongoKitten ID let _id = ObjectId(id) diff --git a/Sources/Application/Routes/Products_Routes.swift b/Sources/Application/Routes/Products_Routes.swift index 452f6fd..fd0fd80 100644 --- a/Sources/Application/Routes/Products_Routes.swift +++ b/Sources/Application/Routes/Products_Routes.swift @@ -14,6 +14,7 @@ func initializeProducts_Routes(app: App) { /// A Codable type that matches the data in our Products in routes private struct Product: Codable { + var id : String var name: String var description: String } @@ -76,7 +77,7 @@ extension MongoController { // Send success response response.headers.setType("json") - try response.send(Array(items)).end() + try response.send([ "Values" : items.compactMap{$0}]).end() } catch { response.status(.internalServerError) Log.error("Error: Unable to retrieve objects from the database") @@ -92,20 +93,13 @@ extension MongoController { } do { - // Create MongoKitten ID - let _id = ObjectId(id)! - // Find item in database - let item = try collection.find(["_id": _id]) - -// else { -// response.status(.internalServerError) -// Log.error("Error: Object doesn't exist") -// } - - response.headers.setType("json") - try response.send(Array(item)).end() + let item = try collection.find(["id" : id]) + response.headers.setType("json") + let items = item.compactMap{$0} + if (!items.isEmpty) {try response.send(items[0]).end()} + else { try response.status(.badRequest).end() } } catch { response.status(.internalServerError) Log.error("Error: Unable to retrieve object from the database") @@ -121,21 +115,16 @@ extension MongoController { Log.error("No body found in request") return } - - // Convert json data to Mongo Swift Document - guard let document = convert(json: data) else { - try response.status(.badRequest).end() - Log.error("Body contains invalid JSON") - return - } + + let product = try! JSONDecoder().decode(Product.self, from: data) do { // Insert into database - try collection.insertOne(Product.init(name: document.keys[0] , description: document.values[0] as! String)) - + try collection.insertOne(product) + // Send success response response.status(.created) - try response.send(json: document).end() + try response.send([ "Added" : product ]).end() } catch { response.status(.internalServerError) @@ -160,21 +149,15 @@ extension MongoController { return } - // Convert json data to MongoKitten Document - guard let document = convert(json: data) else { - try response.status(.badRequest).end() - Log.error("Body contains invalid JSON") - return - } + // edFixMe Update's not working + let document = try Document.init(fromJSON: data) do { - // Create MongoKitten ID - let _id = ObjectId(id)! - // Update Document with ID - let result = try collection.updateOne(filter: ["_id" == _id.hex], update: document) + let result = try collection.updateMany(filter: ["id" : id], update: document) + // Send appropriate result if result?.upsertedCount == 1 { - try response.send(json: document).end() + try response.send([ "Updated" : document]).end() } else { try response.status(.notFound).end() } @@ -195,35 +178,18 @@ extension MongoController { Log.error("Expected parameter: `id`") return } - + do { - // Create MongoKitten ID - // _id = ObjectId(id)! // Remove item from collection - let result = try collection.deleteOne(["_id" == id]) - // Create response code - let status: HTTPStatusCode = result == nil ? .OK : .notFound + let result = try collection.deleteMany(["id" : id]) // Send response - try response.send(status: status).end() + try response.send(["Deleted" : result?.deletedCount]).end() } catch { response.status(.internalServerError) Log.error("Error: Unable to remove object from the database") } } - /*// Handler to delete all entries in the database - fileprivate func deleteAll(request: RouterRequest, response: RouterResponse, next: () -> Void) throws { - do { - // Remove all items from the collection - try collection.remove() - // Send success response - try response.status(.OK).end() - } catch { - response.status(.internalServerError) - Log.error("Error: Unable to remove objects from the database") - } - }*/ - // Helper method to convert json to MongoKitten Document fileprivate func convert(json: Data) -> Document? { guard let jsonStr = String(data: json, encoding: .utf8), diff --git a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift index 6604873..9acd551 100644 --- a/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift +++ b/Sources/Application/Services/ServiceHypersecureDbaasMongodb.swift @@ -4,12 +4,12 @@ import MongoSwift import Foundation func initializeServiceHypersecureDbaasMongodb(cloudEnv: CloudEnv) throws -> SyncMongoClient { - guard let mongodbCredentials = cloudEnv.getHyperSecureDBaaSCredentials(name: "hypersecure_dbaas_mongodb") else { - throw InitializationError("Could not load credentials for HyperProtect MongoDB.") - } + //guard let mongodbCredentials = cloudEnv.getHyperSecureDBaaSCredentials(name: "hypersecure_dbaas_mongodb") else { + //throw InitializationError("Could not load credentials for HyperProtect MongoDB.") + //} // Add SSL Certificate parameters - let mongodbUri = mongodbCredentials.uri.components(separatedBy: "?")[0] + //let mongodbUri = mongodbCredentials.uri.components(separatedBy: "?")[0] let sslOpts = TLSOptions(allowInvalidHostnames: true, caFile: URL(string: "/Users/edesouza/Projects/swift-dbaas-test/kitura-dbaas/Sources/cert.pem"), pemFile: nil) From 4798f087d6dbed67ec3f39484dfaddd194b14e62 Mon Sep 17 00:00:00 2001 From: Elton-Desouza Date: Tue, 22 Oct 2019 16:09:38 -0400 Subject: [PATCH 28/30] Update credential loading process (pre CloudEnv changes) --- Sources/Application/link-services.js | 49453 ------------------------- 1 file changed, 49453 deletions(-) delete mode 100644 Sources/Application/link-services.js diff --git a/Sources/Application/link-services.js b/Sources/Application/link-services.js deleted file mode 100644 index 861941d..0000000 --- a/Sources/Application/link-services.js +++ /dev/null @@ -1,49453 +0,0 @@ -(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0) { - catalogEntry = catalogEntry["resources"][0] - } else { - return Promise.reject(Error("service_name \'" + json["service_name"] + "\' not found in catalog")); - } - var serviceGuid = catalogEntry["id"]; - - // get service plan id - var servicePlans = await this.ResourceCatalog.getPlan(serviceGuid); - var servicePlanGuid = null; - servicePlans = servicePlans["resources"]; - for (let servicePlan of servicePlans) { - if (servicePlan["name"] === json["service_plan"]) { - servicePlanGuid = servicePlan["id"]; - break; - } - } - if (!servicePlanGuid) { - return Promise.reject(Error("service_plan \'" + json["service_plan"] + "\' not valid")); - } - - // get target crn - var locations = await this.ResourceCatalog.getDeployment(servicePlanGuid); - var targetCrn = null; - locations = locations["resources"]; - for (let location of locations) { - const deployment = location["metadata"]["deployment"]; - if (deployment["location"] === json["location"]) { - targetCrn = deployment["target_crn"]; - break; - } - } - if (!targetCrn) { - return Promise.reject(Error("location \'" + json["location"] + "\' not valid")); - } - - // get name - if (!("name" in json)) { - return Promise.reject(Error("name property is missing")); - } - - var validJson = { - "name": json["name"], - "resource_plan_id": servicePlanGuid, - "resource_group_id": this.group_id, - "target_crn": targetCrn - }; - - if ("parameters" in json) { - validJson["parameters"] = json["parameters"]; - } - return validJson; - } - - static getInstanceNameFromCRN(crn) { - // Format: https://console.bluemix.net/docs/overview/crn.html#crn - var vals = crn.split(':'); - if (vals.length >= 5 && vals[0] === "crn" && vals[1] === "v1") { - return vals[4]; - } - return ""; - } - - async loginApiKey(apiKey, account_id) { - - var authToken = await this.IAM.loginApiKey(apiKey); - - this.IAM.setToken(authToken); - this.AccountManagement.setToken(authToken); - this.ResourceInstances.setToken(authToken); - this.ResourceCatalog.setToken(authToken); - this.ResourceManager.setToken(authToken); - - this.accounts = await this.AccountManagement.getAccounts(); - this.accounts = this.accounts.resources; - if (!account_id) { - if (this.accounts.length > 1) { - var desc=[]; - var accountsIds = []; - for (var account of this.accounts) { - console.log(JSON.stringify(account, null, 4)); - desc.push(account.entity.name); - accountsIds.push(account.metadata.guid); - } - var idx = readline.keyInSelect(desc, "Select Account", {"cancel": false}); - this.account_id = accountsIds[idx]; - } else if(this.accounts.length === 1) { - this.account_id = this.accounts[0]["metadata"]["guid"]; - } else { - console.log("ERROR: accounts not found for user") - } - } - - this.groups = await this.ResourceManager.getGroups(this.account_id); - this.group_id = this.groups["resources"][0]["id"]; // assume always want to use first group - - console.log("Login successful"); - return authToken; - } -} - -module.exports = Bluemix; -},{"./AccountManagement":1,"./CloudControllerBase":3,"./ResourceCatalog":9,"./ResourceInstances":10,"./ResourceManager":11,"./UsersIAM":12,"readline-sync":129}],3:[function(require,module,exports){ -"use strict"; - -const HttpUtils = require("./HttpUtils"); -const HttpStatus = require("./HttpStatus"); - -class CloudControllerBase { - constructor(endPoint) { - this.API_URL = endPoint; - this.REST = new HttpUtils(); - this.HttpStatus = HttpStatus; - } - - setEndPoint (endPoint) { - this.API_URL = endPoint; - } - - setToken (token) { - this.AUTH_TOKEN = token; - } -} - -module.exports = CloudControllerBase; - -},{"./HttpStatus":5,"./HttpUtils":6}],4:[function(require,module,exports){ - -const CloudControllerBase = require("./CloudControllerBase"); - -class DbaasManager extends CloudControllerBase { - constructor(endPoint) { - super(endPoint); - this.access_token = ""; - this.user_id = ""; - } - - async loginApiKey(apiKey) { - const url = `${this.API_URL}/auth/token`; - const options = { - method: "GET", - url: url, - headers: { - "api_key": apiKey - } - }; - - var resp = await this.REST.request(options, this.HttpStatus.OK, true); - - this.access_token = resp.access_token; - this.user_id = resp.user_id; - return resp; - } - - async connectKeyProtect(clusterId, kpParams) { - const url = `${this.API_URL}/${this.user_id}/clusters/${clusterId}/keyprotect`; - const options = { - method: "POST", - url: url, - headers: { - "x-auth-token": this.access_token - }, - json: kpParams - }; - return this.REST.request(options, this.HttpStatus.OK, false); - } - - async getClusters() { - const url = `${this.API_URL}/${this.user_id}/clusters`; - const options = { - method: "GET", - url: url, - headers: { - "x-auth-token": this.access_token - } - }; - - return this.REST.request(options, this.HttpStatus.OK, true); - } - -} - -module.exports = DbaasManager; -},{"./CloudControllerBase":3}],5:[function(require,module,exports){ -"use strict"; - -//http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html -//https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/HttpStatus.html - -exports.OK = 200; -exports.CREATED = 201; -exports.NO_CONTENT = 204; -},{}],6:[function(require,module,exports){ -"use strict"; - -const request = require("request"); -const rest = require("restler"); - -class HttpUtils { - constructor() {} - - request (options, httpStatusAssert, jsonOutput) { - let result = null; - - //process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; - const requestWithDefaults = request.defaults({ - rejectUnauthorized: false - }); - - return new Promise(function (resolve, reject) { - - try { - - requestWithDefaults(options, function (error, response, body) { - if (error) { - return reject(error); - } - - if (jsonOutput) { - try { - result = JSON.parse(body); - } catch (errorJSON) { - return reject(body); - } - } else { - result = body; - } - if (!error && response.statusCode === httpStatusAssert) { - return resolve(result); - } - - //Defensive code. - if (body.length === 0) { - return reject("EMPTY_BODY"); - } - return reject(body); - }); - - } catch (error) { - return reject(error); - } - - }); - } - - upload(url, options, httpStatusAssert, jsonOutput) { - return new Promise(function (resolve, reject) { - try { - rest.put(url, options).on("complete", function (result, response) { - if (result instanceof Error) { - reject(result); - } - - if (response.statusCode === httpStatusAssert) { - - if (jsonOutput) { - return resolve(JSON.parse(result)); - } - - return resolve(result); - } - }); - - } catch (error) { - return reject(error); - } - - }); - } -} - -module.exports = HttpUtils; - -},{"request":130,"restler":180}],7:[function(require,module,exports){ - -const CloudControllerBase = require("./CloudControllerBase"); - -class HyperProtectCrypto extends CloudControllerBase { - constructor(endPoint) { - super(endPoint); - } - - setInstance (instance_id) { - this.instance_id = instance_id; - } - - getConnectInfo() { - const url = `${this.API_URL}/crypto_v1/instances/${this.instance_id}`; - const options = { - method: "GET", - url: url, - headers: { - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}`, - } - }; - - return this.REST.request(options, this.HttpStatus.OK, true); - } -} - -module.exports = HyperProtectCrypto; -},{"./CloudControllerBase":3}],8:[function(require,module,exports){ - -const CloudControllerBase = require("./CloudControllerBase"); - -class KeyProtect extends CloudControllerBase { - constructor(endPoint) { - super(endPoint); - } - - setInstance (instance_id) { - this.instance_id = instance_id; - } - - createKey(key_name) { - const url = `${this.API_URL}/keys`; - - var new_key = { - "metadata":{ - "collectionType":"application/vnd.ibm.kms.key+json", - "collectionTotal":1 - }, - "resources":[{ - "type":"application/vnd.ibm.kms.key+json", - "name": key_name, - "state":1, - "algorithmType":"AES", - "algorithmMetadata":{ - "bitLength":"256", - "mode":"CBC_PAD" - }, - "extractable":false, - "algorithmMode":"CBC_PAD", - "algorithmBitSize":256 - }], - }; - - const options = { - method: "POST", - url: url, - headers: { - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}`, - "Bluemix-Instance": this.instance_id, - "accept": "application/vnd.ibm.collection+json" - }, - form: JSON.stringify(new_key) - }; - - return this.REST.request(options, this.HttpStatus.CREATED, true); - } - - getKeys () { - const url = `${this.API_URL}/keys`; - const options = { - method: "GET", - url: url, - headers: { - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}`, - "Bluemix-Instance": this.instance_id, - "accept": "application/vnd.ibm.collection+json" - } - }; - - return this.REST.request(options, this.HttpStatus.OK, true); - } -} - -module.exports = KeyProtect; -},{"./CloudControllerBase":3}],9:[function(require,module,exports){ -"use strict"; - -const CloudControllerBase = require("./CloudControllerBase"); - -class ResourceCatalog extends CloudControllerBase { - - constructor(endPoint) { - super(endPoint); - } - - search (resource_name) { - const url = `${this.API_URL}/api/v1`; - let qs = {'include': '*', 'q': resource_name}; - - const options = { - method: "GET", - url: url, - headers: { - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - qs: qs - }; - return this.REST.request(options, this.HttpStatus.OK, true); - } - - getDeployment (resource_id) { - const url = `${this.API_URL}/api/v1/${resource_id}/deployment`; - let qs = {'include': '*'}; - - const options = { - method: "GET", - url: url, - headers: { - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - qs: qs - }; - return this.REST.request(options, this.HttpStatus.OK, true); - } - - getPlan (resource_id) { - const url = `${this.API_URL}/api/v1/${resource_id}/plan`; - let qs = {}; - - const options = { - method: "GET", - url: url, - headers: { - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - qs: qs - }; - return this.REST.request(options, this.HttpStatus.OK, true); - } - -} - -module.exports = ResourceCatalog; - -},{"./CloudControllerBase":3}],10:[function(require,module,exports){ -"use strict"; - -const CloudControllerBase = require("./CloudControllerBase"); - -/** - * Manages Resource Instances on Cloud Foundry - */ -class ResourceInstances extends CloudControllerBase { - - constructor(endPoint) { - super(endPoint); - } - - getInstances (group_id) { - const url = `${this.API_URL}/v1/resource_instances`; - let qs = {'resource_group_id': group_id}; - - const options = { - method: "GET", - url: url, - headers: { - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - qs: qs - }; - return this.REST.request(options, this.HttpStatus.OK, true); - } - - // TODO not tested - getInstance (guid) { - const url = `${this.API_URL}/v1/resource_instances/${guid}`; - const options = { - method: "GET", - url: url, - headers: { - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - } - }; - - return this.REST.request(options, this.HttpStatus.OK, true); - } - - create (appOptions) { - const url = `${this.API_URL}/v1/resource_instances`; - const options = { - method: "POST", - url: url, - headers: { - "Content-Type": "application/x-www-form-urlencoded", - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - form: JSON.stringify(appOptions) - }; - return this.REST.request(options, this.HttpStatus.CREATED, true).catch(err => { - var err = JSON.parse(err); - if (("last_operation" in err) && (err["last_operation"]["type"] === "create") && (err["last_operation"]["state"] === "in progress")) { - // hack to handle response 202 -- accepted but not finished - return Promise.resolve(err); - } else { - return Promise.reject(Error(err)); - } - }); - } - -} - -module.exports = ResourceInstances; - -},{"./CloudControllerBase":3}],11:[function(require,module,exports){ -"use strict"; - -const CloudControllerBase = require("./CloudControllerBase"); - -class ResourceManager extends CloudControllerBase { - - constructor(endPoint) { - super(endPoint); - } - - getGroups (account_id) { - const url = `${this.API_URL}/v1/resource_groups`; - let qs = {'account_id': account_id}; - - const options = { - method: "GET", - url: url, - headers: { - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - qs: qs - }; - return this.REST.request(options, this.HttpStatus.OK, true); - } - -} - -module.exports = ResourceManager; - -},{"./CloudControllerBase":3}],12:[function(require,module,exports){ -"use strict"; - -const HttpUtils = require("./HttpUtils"); -const HttpStatus = require("./HttpStatus"); - -class UsersIAM { - - constructor(endPoint) { - this.API_URL = endPoint; - this.REST = new HttpUtils(); - this.HttpStatus = HttpStatus; - } - - setToken (token) { - this.AUTH_TOKEN = token; - } - - loginApiKey (apiKey) { - const url = `${this.API_URL}/identity/token`; - const options = { - method: "POST", - url: url, - headers: { - Authorization: "Basic Yng6Yng=", - "Content-Type": "application/x-www-form-urlencoded" - }, - form: { - grant_type: "urn:ibm:params:oauth:grant-type:apikey", - response_type: "cloud_iam,uaa", - uaa_client_id: "cf", - uaa_client_secret: "", - apikey: apiKey - } - }; - - return this.REST.request(options, this.HttpStatus.OK, true); - } - - loginUsernamePassword (username, password) { - const url = `${this.API_URL}/identity/token`; - const options = { - method: "POST", - url: url, - headers: { - Authorization: "Basic Yng6Yng=", - "Content-Type": "application/x-www-form-urlencoded" - }, - form: { - grant_type: "password", - password: password, - username: username, - response_type: "cloud_iam,uaa", - uaa_client_id: "cf", - uaa_client_secret: "", - apikey: apiKey - } - }; - - return this.REST.request(options, this.HttpStatus.OK, true); - } - - getServiceIds (accountId) { - const url = `${this.API_URL}/serviceids`; - - const options = { - method: "GET", - url: url, - headers: { - Accept: "application/json", - Authorization: `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - qs: {"boundTo": `crn:v1:bluemix:public:::a/${accountId}:::`} - }; - return this.REST.request(options, this.HttpStatus.OK, true); - } - - createServiceId (name, accountId) { - const url = `${this.API_URL}/serviceids`; - - const options = { - method: "POST", - url: url, - headers: { - "Accept": "application/json", - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - json: { - "boundTo": `crn:v1:bluemix:public:::a/${accountId}:::`, - "name": name - - } - }; - return this.REST.request(options, this.HttpStatus.CREATED, false); - } - - createServiceIdApiKey (apiKeyName, serviceIdCrn) { - const url = `${this.API_URL}/apikeys`; - - const options = { - method: "POST", - url: url, - headers: { - "Accept": "application/json", - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - json: { - "boundTo": serviceIdCrn, - "name": apiKeyName - - } - }; - return this.REST.request(options, this.HttpStatus.CREATED, false); - } - - createServiceIdPolicy (json, serviceIdCrn) { - var accountId = ""; - var serviceId = ""; - if (serviceIdCrn.startsWith("crn:v1:")) { - accountId = encodeURIComponent(serviceIdCrn.split(':')[6]); - serviceId = encodeURIComponent(serviceIdCrn.split(':')[9]); - } else { - reject(Error("Invalid service-id CRN " + serviceIdCrn)); - } - const uri = `/acms/v1/scopes/${accountId}/service_ids/iam-${serviceId}/policies`; - const baseurl = `${this.API_URL}`; - const options = { - method: "POST", - baseUrl: baseurl, // if url is passed, it will encode %2F in accountId back into a '/' - uri: uri, - headers: { - "Accept": "application/json", - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - json: json - }; - return this.REST.request(options, this.HttpStatus.CREATED, false); - } - - createAuthorization(json, accountId) { - const url = `${this.API_URL}/acms/v2/accounts/${accountId}/policies`; - const options = { - method: "POST", - url: url, - headers: { - "Accept": "application/json", - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - json: json - }; - return this.REST.request(options, this.HttpStatus.CREATED, false); - } - - createApiKey(name) { - const url = `${this.API_URL}/apikeys`; - const json = {"name": name, "boundTo": "self"}; - const options = { - method: "POST", - url: url, - headers: { - "Accept": "application/json", - "Authorization": `${this.AUTH_TOKEN.token_type} ${this.AUTH_TOKEN.access_token}` - }, - json: json - }; - return this.REST.request(options, this.HttpStatus.CREATED, false); - } -} - -module.exports = UsersIAM; - -},{"./HttpStatus":5,"./HttpUtils":6}],13:[function(require,module,exports){ -const CloudControllerBase = require("./CloudControllerBase"); -const BluemixClient = require("./BluemixClient"); -const KeyProtectClient = require("./KeyProtect"); -const DbaasClient = require("./DbaasManager"); -const CryptoClient = require("./HyperProtectCrypto"); -const fs = require('fs'); -const readline = require('readline-sync'); -//const sleep = require('sleep'); - -const CONFIG_FILENAME = "config.json"; -var DEBUG = false; - -// bx catalog search -// bx catalog service # for plan and location -const createResources = [{ - "service_name": "kms", - "service_plan": "tiered-pricing", - "name":"key-protect-name-1", - "location": "us-south" - }, { - "service_name": "hs-crypto", - "service_plan": "freeplan", - "location": "us-south", - "name": "crypto-1" - }, { - "service_name": "hypersecuredbaas", - "name":"hypersecuredbaas-1", - "service_plan": "lite", - "location": "us-south", - "parameters":{ - "name":"clustername", - "admin_name":"adminname", - "password":"adminpassword", - "confirm_password":"adminpassword", - "db_type":"MongoDB", - "license_agree":["agreed"] - } - }]; -const endpoints = { - "API_URL": "https://api.ng.bluemix.net", - "RESOURCE_MANAGER_URL": "https://resource-manager.ng.bluemix.net", - "RESOURCE_CONTROLLER_URL": "https://resource-controller.ng.bluemix.net", - "RESOURCE_CATALOG_URL": "https://resource-catalog.bluemix.net", - "IAM_URL": "https://iam.bluemix.net", - "ACCOUNT_MANAGEMENT_URL": "https://accountmanagement.ng.bluemix.net", - "KEY_PROTECT": "https://keyprotect.us-south.bluemix.net/api/v2", - "CRYPTO_BROKER": "https://zCryptoBroker.mybluemix.net", - "DBAAS": "https://mgmt06.hypersecuredbaas.ibm.com:20000/api/v1" // 4 for eu // mgmt06 for us-south -} - -function getMongoInstances(cluster_json) { - ret = []; - for (i of cluster_json.instances) { - ret.push({'hostname': i.ip.split(':')[0], 'port': i.ip.split(':')[1]}); - } - return ret; -} - -function saveConfig(config) { - fs.writeFileSync(CONFIG_FILENAME, JSON.stringify(config, null, 3)); -} - -function loadConfig() { - try { - var json = JSON.parse(fs.readFileSync(CONFIG_FILENAME)); - } catch(err) { - json = {}; - } - return json; -} - -async function deploy(bx, cfg, createResources) { - // - // create user apikey for dbaas - if (!cfg.apikey) { - var username = readline.question("IBM Cloud username: "); - var password = readline.question("password: ", {"hideEchoBack": true}); - - try { - authToken = await bx.IAM.loginUsernamePassword(username, password); - } catch(err) { - console.log("ERROR: Login failed"); - return; - } - bx.IAM.setToken(authToken); - try { - cfg.apikey = await bx.IAM.createApiKey("swift-starter-apikey"); - console.log("API Key: ", JSON.stringify(cfg.apikey, null, 4)); - cfg.apikey = cfg.apikey.entity.apiKey; - saveConfig(cfg); - } catch(err) { - console.log("ERROR: Failed to create user apikey."); - return; - } - } - - // - // Get dbaas instance id - var dbaas = new DbaasClient(bx.endpoints.DBAAS); - var dbaasClusterId = ""; - try { - await dbaas.loginApiKey(cfg.apikey); - var clusters = await dbaas.getClusters(); - } catch(err) { - console.log("ERROR: Failed to connect to DBaaS. ", err); - return; - } - if (clusters.length > 1) { - var desc=[]; - var clusterids = []; - for (cluster of clusters) { - desc.push(cluster.name); - clusterids.push(cluster.id); - } - var idx = readline.keyInSelect(desc, "Select DBaaS cluster", {"cancel": false}); - dbaasClusterId = clusterids[idx]; - } else if(clusters.length === 1) { - dbaasClusterId = clusters[0].id; - } else { - console.log("ERROR: dbaas instance not found") - // dbaas_json = createResources.filter(p => p.service_name === "hypersecuredbaas")[0]; - // await bx.createInstance(dbaas_json); - } - - - // - // login to bluemix - try { - var authToken = await bx.loginApiKey(cfg.apikey, cfg.account_id); - cfg.account_id = bx.account_id; - saveConfig(cfg); - } catch(err) { - console.log("ERROR: Login failed. ", err); - return; - } - - // - // create crypto instance - var cryptoJson = createResources.filter(p => p.service_name === "hs-crypto")[0]; - if (!cfg.crypto_id) { - var desc = []; - var crypto_ids = []; - var resources = await bx.ResourceInstances.getInstances(bx.group_id); - for (r of resources.resources) { - if (BluemixClient.getInstanceNameFromCRN(r.id) === cryptoJson.service_name) { - desc.push(r.name); - crypto_ids.push(r.guid); - } - } - if (crypto_ids.length > 1) { - var idx = readline.keyInSelect(desc, "Select Hyper Protect Crypto instance", {"cancel": false}); - cfg.crypto_id = crypto_ids[idx]; - } else if (crypto_ids.length === 1) { - cfg.crypto_id = crypto_ids[0]; - } else { - try { - cfg.crypto_id = await bx.createInstance(cryptoJson); - } catch(err) { - console.log("ERROR: Failed to create Hyper Protect Crypto Service. ", JSON.stringify(err, null, 4)); - return; - } - } - saveConfig(cfg); - } - if (DEBUG) console.log("crypto id: ", cfg.crypto_id); - - // - // get crypto connect info for keyprotect - var cryptoInfo = {}; - if (!cfg.keyprotect_id) { - cc = new CryptoClient(bx.endpoints.CRYPTO_BROKER); - cc.setToken(authToken); - cc.setInstance(cfg.crypto_id); - try { - //console.log(JSON.stringify(cc)); - //sleep.sleep(10); - cryptoInfo = await cc.getConnectInfo(); - } catch(err) { - console.log("ERROR: Failed to retrieve Hyper Protect Crypto connection info.", JSON.stringify(err, null, 4)); - return; - } - if (DEBUG) console.log(JSON.stringify(cryptoInfo, null, 4)); - } - - // - // create Key Protect instance and get instance id - kpJson = createResources.filter(p => p.service_name === "kms")[0]; - if (!cfg.keyprotect_id) { - kpJson["parameters"] = cryptoInfo; - try { - cfg.keyprotect_id = await bx.createInstance(kpJson); - saveConfig(cfg); - } catch(err) { - console.log("ERROR: Failed to create Key Protect Service. ", JSON.stringify(err, null, 4)); - return; - } - } - if (DEBUG) console.log("keyprotect guid: ", cfg.keyprotect_id); - - // - // create root key with KeyProtect - var kp = new KeyProtectClient(bx.endpoints.KEY_PROTECT); - kp.setToken(authToken); - kp.setInstance(cfg.keyprotect_id); - if (!cfg.keyprotect_root_key_id) { - try { - console.log("Creating root key for dbaas with Key Protect..."); - cfg.keyprotect_root_key_id = await kp.createKey("key-for-dbaas"); - cfg.keyprotect_root_key_id = cfg.keyprotect_root_key_id.resources[0].id; - saveConfig(cfg); - } catch(err) { - console.log("ERROR: Failed to create root key. ", JSON.stringify(err, null, 4)); - return; - } - } - if (DEBUG) console.log("key protect root key id: ", cfg.keyprotect_root_key_id); - - // - // create authorization between keyprotect and crypto - var authPolicy = { - "roles": [{"id": "crn:v1:bluemix:public:iam::::role:Viewer"}], - "resources":[{ - "serviceName": "hs-crypto", - "accountId": bx.account_id - }], - "subjects": [{ - "serviceName": "kms", - "accountId": bx.account_id - }] - }; - if (!cfg.crypto_keyprotect_auth_id) { - try { - res = await bx.IAM.createAuthorization(authPolicy, bx.account_id); - cfg.crypto_keyprotect_auth_id = res.id; - saveConfig(cfg); - } catch(err) { - console.log("ERROR: Failed to create authorization between KeyProtect and Crypto. ", JSON.stringify(err, null, 4)); - return; - } - } - if (DEBUG) console.log("keyprotect and crypto authorization id: ", cfg.crypto_keyprotect_auth_id); - - // - // create service api key to be used with dbaas - var policy1 = { - "roles": [{"id": "crn:v1:bluemix:public:iam::::role:Viewer"}], - "resources": [{ - "resourceType": "resource-group", - "accountId": bx.account_id, - "resource": bx.group_id - }] - }; - var policy2 = { - "roles": [{"id":"crn:v1:bluemix:public:iam::::role:Viewer"}, {"id":"crn:v1:bluemix:public:iam::::serviceRole:Reader"}], - "resources":[{ - "serviceName":"kms", - "accountId": bx.account_id, - "resourceGroupId": bx.group_id - }] - }; - if (!cfg.service_id_api_key) { - try { - var serviceid_crn = await bx.IAM.createServiceId("kp-dbaas-serviceid", bx.account_id); - serviceid_crn = serviceid_crn["metadata"]["crn"]; - cfg.service_id_api_key = await bx.IAM.createServiceIdApiKey("kp-dbaas-apikey", serviceid_crn); - cfg.service_id_api_key = cfg.service_id_api_key["entity"]["apiKey"]; - await bx.IAM.createServiceIdPolicy(policy1, serviceid_crn); - await bx.IAM.createServiceIdPolicy(policy2, serviceid_crn); - saveConfig(cfg); - } catch (err) { - console.log("ERROR: Failed to create service id for dbaas"); - return; - } - } - if (DEBUG) console.log("service id apikey: ", cfg.service_id_api_key); - - // - // Finally, connect keyprotect to dbaas - var kpParams = { - "service_id_api_key": cfg.service_id_api_key, - "service_instance_id": cfg.keyprotect_id, - "key_id": cfg.keyprotect_root_key_id - } - try { - var res = await dbaas.connectKeyProtect(dbaasClusterId, kpParams); - } catch(err) { - console.log("ERROR: Failed to connect KeyProtect to DBaas. ", err); - return; - } - console.log("Finished deployment!"); - return; -} - -console.log(" "); -console.log("swift starter kit deployment helper"); -console.log(" "); - -apiKey = process.argv[2]; -if (process.argv[3] === "-v") { - DEBUG = true; -} - -var bx = new BluemixClient(endpoints); - -var cfg = loadConfig(); -if (!cfg.apikey && apiKey) { - cfg.apikey = apiKey; - saveConfig(cfg); -} -deploy(bx, cfg, createResources).then(console.log("")); - -},{"./BluemixClient":2,"./CloudControllerBase":3,"./DbaasManager":4,"./HyperProtectCrypto":7,"./KeyProtect":8,"fs":undefined,"readline-sync":129}],14:[function(require,module,exports){ -'use strict'; - -var KEYWORDS = [ - 'multipleOf', - 'maximum', - 'exclusiveMaximum', - 'minimum', - 'exclusiveMinimum', - 'maxLength', - 'minLength', - 'pattern', - 'additionalItems', - 'maxItems', - 'minItems', - 'uniqueItems', - 'maxProperties', - 'minProperties', - 'required', - 'additionalProperties', - 'enum', - 'format', - 'const' -]; - -module.exports = function (metaSchema, keywordsJsonPointers) { - for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. - * @param {Object} options optional options with properties `separator` and `dataVar`. - * @return {String} human readable string with all errors descriptions - */ -function errorsText(errors, options) { - errors = errors || this.errors; - if (!errors) return 'No errors'; - options = options || {}; - var separator = options.separator === undefined ? ', ' : options.separator; - var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; - - var text = ''; - for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; -// For the source: https://gist.github.com/dperini/729294 -// For test cases: https://mathiasbynens.be/demo/url-regex -// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. -// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; -var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; -var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; -var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$|^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; -var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; - - -module.exports = formats; - -function formats(mode) { - mode = mode == 'full' ? 'full' : 'fast'; - return util.copy(formats[mode]); -} - - -formats.fast = { - // date: http://tools.ietf.org/html/rfc3339#section-5.6 - date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, - // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 - time: /^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i, - 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)$/i, - // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js - uri: /^(?:[a-z][a-z0-9+-.]*)(?::|\/)\/?[^\s]*$/i, - 'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i, - 'uri-template': URITEMPLATE, - url: URL, - // email (sources from jsen validator): - // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') - email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, - hostname: HOSTNAME, - // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - // uuid: http://tools.ietf.org/html/rfc4122 - uuid: UUID, - // JSON-pointer: https://tools.ietf.org/html/rfc6901 - // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A - 'json-pointer': JSON_POINTER, - // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -formats.full = { - date: date, - time: time, - 'date-time': date_time, - uri: uri, - 'uri-reference': URIREF, - 'uri-template': URITEMPLATE, - url: URL, - email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, - hostname: hostname, - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - uuid: UUID, - 'json-pointer': JSON_POINTER, - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -function date(str) { - // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 - var matches = str.match(DATE); - if (!matches) return false; - - var month = +matches[1]; - var day = +matches[2]; - return month >= 1 && month <= 12 && day >= 1 && day <= DAYS[month]; -} - - -function time(str, full) { - var matches = str.match(TIME); - if (!matches) return false; - - var hour = matches[1]; - var minute = matches[2]; - var second = matches[3]; - var timeZone = matches[5]; - return hour <= 23 && minute <= 59 && second <= 59 && (!full || timeZone); -} - - -var DATE_TIME_SEPARATOR = /t|\s/i; -function date_time(str) { - // http://tools.ietf.org/html/rfc3339#section-5.6 - var dateTime = str.split(DATE_TIME_SEPARATOR); - return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); -} - - -function hostname(str) { - // https://tools.ietf.org/html/rfc1034#section-3.5 - // https://tools.ietf.org/html/rfc1123#section-2 - return str.length <= 255 && HOSTNAME.test(str); -} - - -var NOT_URI_FRAGMENT = /\/|:/; -function uri(str) { - // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." - return NOT_URI_FRAGMENT.test(str) && URI.test(str); -} - - -var Z_ANCHOR = /[^\\]\\Z/; -function regex(str) { - if (Z_ANCHOR.test(str)) return false; - try { - new RegExp(str); - return true; - } catch(e) { - return false; - } -} - -},{"./util":26}],21:[function(require,module,exports){ -'use strict'; - -var resolve = require('./resolve') - , util = require('./util') - , errorClasses = require('./error_classes') - , stableStringify = require('fast-json-stable-stringify'); - -var validateGenerator = require('../dotjs/validate'); - -/** - * Functions below are used inside compiled validations function - */ - -var co = require('co'); -var ucs2length = util.ucs2length; -var equal = require('fast-deep-equal'); - -// this error is thrown by async schemas to return validation errors via exception -var ValidationError = errorClasses.Validation; - -module.exports = compile; - - -/** - * Compiles schema to validation function - * @this Ajv - * @param {Object} schema schema object - * @param {Object} root object with information about the root schema for this schema - * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution - * @param {String} baseId base ID for IDs in the schema - * @return {Function} validation function - */ -function compile(schema, root, localRefs, baseId) { - /* jshint validthis: true, evil: true */ - /* eslint no-shadow: 0 */ - var self = this - , opts = this._opts - , refVal = [ undefined ] - , refs = {} - , patterns = [] - , patternsHash = {} - , defaults = [] - , defaultsHash = {} - , customRules = []; - - root = root || { schema: schema, refVal: refVal, refs: refs }; - - var c = checkCompiling.call(this, schema, root, baseId); - var compilation = this._compilations[c.index]; - if (c.compiling) return (compilation.callValidate = callValidate); - - var formats = this._formats; - var RULES = this.RULES; - - try { - var v = localCompile(schema, root, localRefs, baseId); - compilation.validate = v; - var cv = compilation.callValidate; - if (cv) { - cv.schema = v.schema; - cv.errors = null; - cv.refs = v.refs; - cv.refVal = v.refVal; - cv.root = v.root; - cv.$async = v.$async; - if (opts.sourceCode) cv.source = v.source; - } - return v; - } finally { - endCompiling.call(this, schema, root, baseId); - } - - function callValidate() { - var validate = compilation.validate; - var result = validate.apply(null, arguments); - callValidate.errors = validate.errors; - return result; - } - - function localCompile(_schema, _root, localRefs, baseId) { - var isRoot = !_root || (_root && _root.schema == _schema); - if (_root.schema != root.schema) - return compile.call(self, _schema, _root, localRefs, baseId); - - var $async = _schema.$async === true; - - var sourceCode = validateGenerator({ - isTop: true, - schema: _schema, - isRoot: isRoot, - baseId: baseId, - root: _root, - schemaPath: '', - errSchemaPath: '#', - errorPath: '""', - MissingRefError: errorClasses.MissingRef, - RULES: RULES, - validate: validateGenerator, - util: util, - resolve: resolve, - resolveRef: resolveRef, - usePattern: usePattern, - useDefault: useDefault, - useCustomRule: useCustomRule, - opts: opts, - formats: formats, - logger: self.logger, - self: self - }); - - sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) - + vars(defaults, defaultCode) + vars(customRules, customRuleCode) - + sourceCode; - - if (opts.processCode) sourceCode = opts.processCode(sourceCode); - // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); - var validate; - try { - var makeValidate = new Function( - 'self', - 'RULES', - 'formats', - 'root', - 'refVal', - 'defaults', - 'customRules', - 'co', - 'equal', - 'ucs2length', - 'ValidationError', - sourceCode - ); - - validate = makeValidate( - self, - RULES, - formats, - root, - refVal, - defaults, - customRules, - co, - equal, - ucs2length, - ValidationError - ); - - refVal[0] = validate; - } catch(e) { - self.logger.error('Error compiling schema, function code:', sourceCode); - throw e; - } - - validate.schema = _schema; - validate.errors = null; - validate.refs = refs; - validate.refVal = refVal; - validate.root = isRoot ? validate : _root; - if ($async) validate.$async = true; - if (opts.sourceCode === true) { - validate.source = { - code: sourceCode, - patterns: patterns, - defaults: defaults - }; - } - - return validate; - } - - function resolveRef(baseId, ref, isRoot) { - ref = resolve.url(baseId, ref); - var refIndex = refs[ref]; - var _refVal, refCode; - if (refIndex !== undefined) { - _refVal = refVal[refIndex]; - refCode = 'refVal[' + refIndex + ']'; - return resolvedRef(_refVal, refCode); - } - if (!isRoot && root.refs) { - var rootRefId = root.refs[ref]; - if (rootRefId !== undefined) { - _refVal = root.refVal[rootRefId]; - refCode = addLocalRef(ref, _refVal); - return resolvedRef(_refVal, refCode); - } - } - - refCode = addLocalRef(ref); - var v = resolve.call(self, localCompile, root, ref); - if (v === undefined) { - var localSchema = localRefs && localRefs[ref]; - if (localSchema) { - v = resolve.inlineRef(localSchema, opts.inlineRefs) - ? localSchema - : compile.call(self, localSchema, root, localRefs, baseId); - } - } - - if (v === undefined) { - removeLocalRef(ref); - } else { - replaceLocalRef(ref, v); - return resolvedRef(v, refCode); - } - } - - function addLocalRef(ref, v) { - var refId = refVal.length; - refVal[refId] = v; - refs[ref] = refId; - return 'refVal' + refId; - } - - function removeLocalRef(ref) { - delete refs[ref]; - } - - function replaceLocalRef(ref, v) { - var refId = refs[ref]; - refVal[refId] = v; - } - - function resolvedRef(refVal, code) { - return typeof refVal == 'object' || typeof refVal == 'boolean' - ? { code: code, schema: refVal, inline: true } - : { code: code, $async: refVal && refVal.$async }; - } - - function usePattern(regexStr) { - var index = patternsHash[regexStr]; - if (index === undefined) { - index = patternsHash[regexStr] = patterns.length; - patterns[index] = regexStr; - } - return 'pattern' + index; - } - - function useDefault(value) { - switch (typeof value) { - case 'boolean': - case 'number': - return '' + value; - case 'string': - return util.toQuotedString(value); - case 'object': - if (value === null) return 'null'; - var valueStr = stableStringify(value); - var index = defaultsHash[valueStr]; - if (index === undefined) { - index = defaultsHash[valueStr] = defaults.length; - defaults[index] = value; - } - return 'default' + index; - } - } - - function useCustomRule(rule, schema, parentSchema, it) { - var validateSchema = rule.definition.validateSchema; - if (validateSchema && self._opts.validateSchema !== false) { - var valid = validateSchema(schema); - if (!valid) { - var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); - if (self._opts.validateSchema == 'log') self.logger.error(message); - else throw new Error(message); - } - } - - var compile = rule.definition.compile - , inline = rule.definition.inline - , macro = rule.definition.macro; - - var validate; - if (compile) { - validate = compile.call(self, schema, parentSchema, it); - } else if (macro) { - validate = macro.call(self, schema, parentSchema, it); - if (opts.validateSchema !== false) self.validateSchema(validate, true); - } else if (inline) { - validate = inline.call(self, it, rule.keyword, schema, parentSchema); - } else { - validate = rule.definition.validate; - if (!validate) return; - } - - if (validate === undefined) - throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); - - var index = customRules.length; - customRules[index] = validate; - - return { - code: 'customRule' + index, - validate: validate - }; - } -} - - -/** - * Checks if the schema is currently compiled - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) - */ -function checkCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var index = compIndex.call(this, schema, root, baseId); - if (index >= 0) return { index: index, compiling: true }; - index = this._compilations.length; - this._compilations[index] = { - schema: schema, - root: root, - baseId: baseId - }; - return { index: index, compiling: false }; -} - - -/** - * Removes the schema from the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - */ -function endCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var i = compIndex.call(this, schema, root, baseId); - if (i >= 0) this._compilations.splice(i, 1); -} - - -/** - * Index of schema compilation in the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Integer} compilation index - */ -function compIndex(schema, root, baseId) { - /* jshint validthis: true */ - for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { - // high surrogate, and there is a next character - value = str.charCodeAt(pos); - if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate - } - } - return length; -}; - -},{}],26:[function(require,module,exports){ -'use strict'; - - -module.exports = { - copy: copy, - checkDataType: checkDataType, - checkDataTypes: checkDataTypes, - coerceToTypes: coerceToTypes, - toHash: toHash, - getProperty: getProperty, - escapeQuotes: escapeQuotes, - equal: require('fast-deep-equal'), - ucs2length: require('./ucs2length'), - varOccurences: varOccurences, - varReplace: varReplace, - cleanUpCode: cleanUpCode, - finalCleanUpCode: finalCleanUpCode, - schemaHasRules: schemaHasRules, - schemaHasRulesExcept: schemaHasRulesExcept, - toQuotedString: toQuotedString, - getPathExpr: getPathExpr, - getPath: getPath, - getData: getData, - unescapeFragment: unescapeFragment, - unescapeJsonPointer: unescapeJsonPointer, - escapeFragment: escapeFragment, - escapeJsonPointer: escapeJsonPointer -}; - - -function copy(o, to) { - to = to || {}; - for (var key in o) to[key] = o[key]; - return to; -} - - -function checkDataType(dataType, data, negate) { - var EQUAL = negate ? ' !== ' : ' === ' - , AND = negate ? ' || ' : ' && ' - , OK = negate ? '!' : '' - , NOT = negate ? '' : '!'; - switch (dataType) { - case 'null': return data + EQUAL + 'null'; - case 'array': return OK + 'Array.isArray(' + data + ')'; - case 'object': return '(' + OK + data + AND + - 'typeof ' + data + EQUAL + '"object"' + AND + - NOT + 'Array.isArray(' + data + '))'; - case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + - NOT + '(' + data + ' % 1)' + - AND + data + EQUAL + data + ')'; - default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; - } -} - - -function checkDataTypes(dataTypes, data) { - switch (dataTypes.length) { - case 1: return checkDataType(dataTypes[0], data, true); - default: - var code = ''; - var types = toHash(dataTypes); - if (types.array && types.object) { - code = types.null ? '(': '(!' + data + ' || '; - code += 'typeof ' + data + ' !== "object")'; - delete types.null; - delete types.array; - delete types.object; - } - if (types.number) delete types.integer; - for (var t in types) - code += (code ? ' && ' : '' ) + checkDataType(t, data, true); - - return code; - } -} - - -var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); -function coerceToTypes(optionCoerceTypes, dataTypes) { - if (Array.isArray(dataTypes)) { - var types = []; - for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); - return paths[lvl - up]; - } - - if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); - data = 'data' + ((lvl - up) || ''); - if (!jsonPointer) return data; - } - - var expr = data; - var segments = jsonPointer.split('/'); - for (var i=0; i', - $notOp = $isMax ? '>' : '<', - $errorKeyword = undefined; - if ($isDataExcl) { - var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), - $exclusive = 'exclusive' + $lvl, - $exclType = 'exclType' + $lvl, - $exclIsNumber = 'exclIsNumber' + $lvl, - $opExpr = 'op' + $lvl, - $opStr = '\' + ' + $opExpr + ' + \''; - out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; - $schemaValueExcl = 'schemaExcl' + $lvl; - out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; - var $errorKeyword = $exclusiveKeyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';'; - } else { - var $exclIsNumber = typeof $schemaExcl == 'number', - $opStr = $op; - if ($exclIsNumber && $isData) { - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; - } else { - if ($exclIsNumber && $schema === undefined) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $schemaValue = $schemaExcl; - $notOp += '='; - } else { - if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); - if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $notOp += '='; - } else { - $exclusive = false; - $opStr += '='; - } - } - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; - } - } - $errorKeyword = $errorKeyword || $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be ' + ($opStr) + ' '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],28:[function(require,module,exports){ -'use strict'; -module.exports = function generate__limitItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $op = $keyword == 'maxItems' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxItems') { - out += 'more'; - } else { - out += 'less'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],29:[function(require,module,exports){ -'use strict'; -module.exports = function generate__limitLength(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $op = $keyword == 'maxLength' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - if (it.opts.unicode === false) { - out += ' ' + ($data) + '.length '; - } else { - out += ' ucs2length(' + ($data) + ') '; - } - out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be '; - if ($keyword == 'maxLength') { - out += 'longer'; - } else { - out += 'shorter'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' characters\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],30:[function(require,module,exports){ -'use strict'; -module.exports = function generate__limitProperties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $op = $keyword == 'maxProperties' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxProperties') { - out += 'more'; - } else { - out += 'less'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' properties\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],31:[function(require,module,exports){ -'use strict'; -module.exports = function generate_allOf(it, $keyword, $ruleType) { - var out = ' '; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $currentBaseId = $it.baseId, - $allSchemasEmpty = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $allSchemasEmpty = false; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($breakOnError) { - if ($allSchemasEmpty) { - out += ' if (true) { '; - } else { - out += ' ' + ($closingBraces.slice(0, -1)) + ' '; - } - } - out = it.util.cleanUpCode(out); - return out; -} - -},{}],32:[function(require,module,exports){ -'use strict'; -module.exports = function generate_anyOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $noEmptySchema = $schema.every(function($sch) { - return it.util.schemaHasRules($sch, it.RULES.all); - }); - if ($noEmptySchema) { - var $currentBaseId = $it.baseId; - out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; - $closingBraces += '}'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should match some schema in anyOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - out = it.util.cleanUpCode(out); - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} - -},{}],33:[function(require,module,exports){ -'use strict'; -module.exports = function generate_const(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!$isData) { - out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; - } - out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should be equal to constant\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' }'; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],34:[function(require,module,exports){ -'use strict'; -module.exports = function generate_contains(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId, - $nonEmptySchema = it.util.schemaHasRules($schema, it.RULES.all); - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($nonEmptySchema) { - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (' + ($nextValid) + ') break; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; - } else { - out += ' if (' + ($data) + '.length == 0) {'; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should contain a valid item\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - if ($nonEmptySchema) { - out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - } - if (it.opts.allErrors) { - out += ' } '; - } - out = it.util.cleanUpCode(out); - return out; -} - -},{}],35:[function(require,module,exports){ -'use strict'; -module.exports = function generate_custom(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $rule = this, - $definition = 'definition' + $lvl, - $rDef = $rule.definition, - $closingBraces = ''; - var $compile, $inline, $macro, $ruleValidate, $validateCode; - if ($isData && $rDef.$data) { - $validateCode = 'keywordValidate' + $lvl; - var $validateSchema = $rDef.validateSchema; - out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; - } else { - $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); - if (!$ruleValidate) return; - $schemaValue = 'validate.schema' + $schemaPath; - $validateCode = $ruleValidate.code; - $compile = $rDef.compile; - $inline = $rDef.inline; - $macro = $rDef.macro; - } - var $ruleErrs = $validateCode + '.errors', - $i = 'i' + $lvl, - $ruleErr = 'ruleErr' + $lvl, - $asyncKeyword = $rDef.async; - if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); - if (!($inline || $macro)) { - out += '' + ($ruleErrs) + ' = null;'; - } - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($isData && $rDef.$data) { - $closingBraces += '}'; - out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; - if ($validateSchema) { - $closingBraces += '}'; - out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; - } - } - if ($inline) { - if ($rDef.statements) { - out += ' ' + ($ruleValidate.validate) + ' '; - } else { - out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; - } - } else if ($macro) { - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - $it.schema = $ruleValidate.validate; - $it.schemaPath = ''; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($code); - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - out += ' ' + ($validateCode) + '.call( '; - if (it.opts.passContext) { - out += 'this'; - } else { - out += 'self'; - } - if ($compile || $rDef.schema === false) { - out += ' , ' + ($data) + ' '; - } else { - out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; - } - out += ' , (dataPath || \'\')'; - if (it.errorPath != '""') { - out += ' + ' + (it.errorPath); - } - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; - var def_callRuleValidate = out; - out = $$outStack.pop(); - if ($rDef.errors === false) { - out += ' ' + ($valid) + ' = '; - if ($asyncKeyword) { - out += '' + (it.yieldAwait); - } - out += '' + (def_callRuleValidate) + '; '; - } else { - if ($asyncKeyword) { - $ruleErrs = 'customErrors' + $lvl; - out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = ' + (it.yieldAwait) + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; - } else { - out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; - } - } - } - if ($rDef.modifying) { - out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; - } - out += '' + ($closingBraces); - if ($rDef.valid) { - if ($breakOnError) { - out += ' if (true) { '; - } - } else { - out += ' if ( '; - if ($rDef.valid === undefined) { - out += ' !'; - if ($macro) { - out += '' + ($nextValid); - } else { - out += '' + ($valid); - } - } else { - out += ' ' + (!$rDef.valid) + ' '; - } - out += ') { '; - $errorKeyword = $rule.keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - var def_customError = out; - out = $$outStack.pop(); - if ($inline) { - if ($rDef.errors) { - if ($rDef.errors != 'full') { - out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '= 0) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } else { - throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); - } - } - var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; - var $formatType = $isObject && $format.type || 'string'; - if ($isObject) { - var $async = $format.async === true; - $format = $format.validate; - } - if ($formatType != $ruleType) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } - if ($async) { - if (!it.async) throw new Error('async format in sync schema'); - var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; - out += ' if (!(' + (it.yieldAwait) + ' ' + ($formatRef) + '(' + ($data) + '))) { '; - } else { - out += ' if (! '; - var $formatRef = 'formats' + it.util.getProperty($schema); - if ($isObject) $formatRef += '.validate'; - if (typeof $format == 'function') { - out += ' ' + ($formatRef) + '(' + ($data) + ') '; - } else { - out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; - } - out += ') { '; - } - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match format "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],39:[function(require,module,exports){ -'use strict'; -module.exports = function generate_items(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId; - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if (Array.isArray($schema)) { - var $additionalItems = it.schema.additionalItems; - if ($additionalItems === false) { - out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - $closingBraces += '}'; - out += ' else { '; - } - } - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; - var $passData = $data + '[' + $i + ']'; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); - $it.dataPathArr[$dataNxt] = $i; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if (typeof $additionalItems == 'object' && it.util.schemaHasRules($additionalItems, it.RULES.all)) { - $it.schema = $additionalItems; - $it.schemaPath = it.schemaPath + '.additionalItems'; - $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } else if (it.util.schemaHasRules($schema, it.RULES.all)) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' }'; - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - out = it.util.cleanUpCode(out); - return out; -} - -},{}],40:[function(require,module,exports){ -'use strict'; -module.exports = function generate_multipleOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - out += 'var division' + ($lvl) + ';if ('; - if ($isData) { - out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; - } - out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; - if (it.opts.multipleOfPrecision) { - out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; - } else { - out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; - } - out += ' ) '; - if ($isData) { - out += ' ) '; - } - out += ' ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be multiple of '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],41:[function(require,module,exports){ -'use strict'; -module.exports = function generate_not(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - $it.level++; - var $nextValid = 'valid' + $it.level; - if (it.util.schemaHasRules($schema, it.RULES.all)) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.createErrors = false; - var $allErrorsOption; - if ($it.opts.allErrors) { - $allErrorsOption = $it.opts.allErrors; - $it.opts.allErrors = false; - } - out += ' ' + (it.validate($it)) + ' '; - $it.createErrors = true; - if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (' + ($nextValid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - } else { - out += ' var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if ($breakOnError) { - out += ' if (false) { '; - } - } - return out; -} - -},{}],42:[function(require,module,exports){ -'use strict'; -module.exports = function generate_oneOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - out += 'var ' + ($errs) + ' = errors;var prevValid' + ($lvl) + ' = false;var ' + ($valid) + ' = false;'; - var $currentBaseId = $it.baseId; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - } else { - out += ' var ' + ($nextValid) + ' = true; '; - } - if ($i) { - out += ' if (' + ($nextValid) + ' && prevValid' + ($lvl) + ') ' + ($valid) + ' = false; else { '; - $closingBraces += '}'; - } - out += ' if (' + ($nextValid) + ') ' + ($valid) + ' = prevValid' + ($lvl) + ' = true;'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should match exactly one schema in oneOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; - if (it.opts.allErrors) { - out += ' } '; - } - return out; -} - -},{}],43:[function(require,module,exports){ -'use strict'; -module.exports = function generate_pattern(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; - } - out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match pattern "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],44:[function(require,module,exports){ -'use strict'; -module.exports = function generate_properties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl; - var $schemaKeys = Object.keys($schema || {}), - $pProperties = it.schema.patternProperties || {}, - $pPropertyKeys = Object.keys($pProperties), - $aProperties = it.schema.additionalProperties, - $someProperties = $schemaKeys.length || $pPropertyKeys.length, - $noAdditional = $aProperties === false, - $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, - $removeAdditional = it.opts.removeAdditional, - $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - var $required = it.schema.required; - if ($required && !(it.opts.v5 && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required); - if (it.opts.patternGroups) { - var $pgProperties = it.schema.patternGroups || {}, - $pgPropertyKeys = Object.keys($pgProperties); - } - out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined;'; - } - if ($checkAdditional) { - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - if ($someProperties) { - out += ' var isAdditional' + ($lvl) + ' = !(false '; - if ($schemaKeys.length) { - if ($schemaKeys.length > 5) { - out += ' || validate.schema' + ($schemaPath) + '[' + ($key) + '] '; - } else { - var arr1 = $schemaKeys; - if (arr1) { - var $propertyKey, i1 = -1, - l1 = arr1.length - 1; - while (i1 < l1) { - $propertyKey = arr1[i1 += 1]; - out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; - } - } - } - } - if ($pPropertyKeys.length) { - var arr2 = $pPropertyKeys; - if (arr2) { - var $pProperty, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $pProperty = arr2[$i += 1]; - out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; - } - } - } - if (it.opts.patternGroups && $pgPropertyKeys.length) { - var arr3 = $pgPropertyKeys; - if (arr3) { - var $pgProperty, $i = -1, - l3 = arr3.length - 1; - while ($i < l3) { - $pgProperty = arr3[$i += 1]; - out += ' || ' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ') '; - } - } - } - out += ' ); if (isAdditional' + ($lvl) + ') { '; - } - if ($removeAdditional == 'all') { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - var $currentErrorPath = it.errorPath; - var $additionalProperty = '\' + ' + $key + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - } - if ($noAdditional) { - if ($removeAdditional) { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - out += ' ' + ($nextValid) + ' = false; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalProperties'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have additional properties\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - out += ' break; '; - } - } - } else if ($additionalIsSchema) { - if ($removeAdditional == 'failing') { - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - } else { - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - } - } - it.errorPath = $currentErrorPath; - } - if ($someProperties) { - out += ' } '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - var $useDefaults = it.opts.useDefaults && !it.compositeRule; - if ($schemaKeys.length) { - var arr4 = $schemaKeys; - if (arr4) { - var $propertyKey, i4 = -1, - l4 = arr4.length - 1; - while (i4 < l4) { - $propertyKey = arr4[i4 += 1]; - var $sch = $schema[$propertyKey]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - var $prop = it.util.getProperty($propertyKey), - $passData = $data + $prop, - $hasDefault = $useDefaults && $sch.default !== undefined; - $it.schema = $sch; - $it.schemaPath = $schemaPath + $prop; - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); - $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); - $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - $code = it.util.varReplace($code, $nextData, $passData); - var $useData = $passData; - } else { - var $useData = $nextData; - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; - } - if ($hasDefault) { - out += ' ' + ($code) + ' '; - } else { - if ($requiredHash && $requiredHash[$propertyKey]) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = false; '; - var $currentErrorPath = it.errorPath, - $currErrSchemaPath = $errSchemaPath, - $missingProperty = it.util.escapeQuotes($propertyKey); - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - $errSchemaPath = it.errSchemaPath + '/required'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - it.errorPath = $currentErrorPath; - out += ' } else { '; - } else { - if ($breakOnError) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = true; } else { '; - } else { - out += ' if (' + ($useData) + ' !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ' ) { '; - } - } - out += ' ' + ($code) + ' } '; - } - } - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($pPropertyKeys.length) { - var arr5 = $pPropertyKeys; - if (arr5) { - var $pProperty, i5 = -1, - l5 = arr5.length - 1; - while (i5 < l5) { - $pProperty = arr5[i5 += 1]; - var $sch = $pProperties[$pProperty]; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $it.schema = $sch; - $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); - $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else ' + ($nextValid) + ' = true; '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - } - if (it.opts.patternGroups && $pgPropertyKeys.length) { - var arr6 = $pgPropertyKeys; - if (arr6) { - var $pgProperty, i6 = -1, - l6 = arr6.length - 1; - while (i6 < l6) { - $pgProperty = arr6[i6 += 1]; - var $pgSchema = $pgProperties[$pgProperty], - $sch = $pgSchema.schema; - if (it.util.schemaHasRules($sch, it.RULES.all)) { - $it.schema = $sch; - $it.schemaPath = it.schemaPath + '.patternGroups' + it.util.getProperty($pgProperty) + '.schema'; - $it.errSchemaPath = it.errSchemaPath + '/patternGroups/' + it.util.escapeFragment($pgProperty) + '/schema'; - out += ' var pgPropCount' + ($lvl) + ' = 0; '; - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' if (' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ')) { pgPropCount' + ($lvl) + '++; '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else ' + ($nextValid) + ' = true; '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - var $pgMin = $pgSchema.minimum, - $pgMax = $pgSchema.maximum; - if ($pgMin !== undefined || $pgMax !== undefined) { - out += ' var ' + ($valid) + ' = true; '; - var $currErrSchemaPath = $errSchemaPath; - if ($pgMin !== undefined) { - var $limit = $pgMin, - $reason = 'minimum', - $moreOrLess = 'less'; - out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' >= ' + ($pgMin) + '; '; - $errSchemaPath = it.errSchemaPath + '/patternGroups/minimum'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('patternGroups') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \'' + ($reason) + '\', limit: ' + ($limit) + ', pattern: \'' + (it.util.escapeQuotes($pgProperty)) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern "' + (it.util.escapeQuotes($pgProperty)) + '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($pgMax !== undefined) { - out += ' else '; - } - } - if ($pgMax !== undefined) { - var $limit = $pgMax, - $reason = 'maximum', - $moreOrLess = 'more'; - out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' <= ' + ($pgMax) + '; '; - $errSchemaPath = it.errSchemaPath + '/patternGroups/maximum'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('patternGroups') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \'' + ($reason) + '\', limit: ' + ($limit) + ', pattern: \'' + (it.util.escapeQuotes($pgProperty)) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern "' + (it.util.escapeQuotes($pgProperty)) + '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - } - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - out += ' if (' + ($valid) + ') { '; - $closingBraces += '}'; - } - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - out = it.util.cleanUpCode(out); - return out; -} - -},{}],45:[function(require,module,exports){ -'use strict'; -module.exports = function generate_propertyNames(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - if (it.util.schemaHasRules($schema, it.RULES.all)) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $i = 'i' + $lvl, - $invalidName = '\' + ' + $key + ' + \'', - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - out += ' var ' + ($errs) + ' = errors; '; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined; '; - } - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' var startErrs' + ($lvl) + ' = errors; '; - var $passData = $key; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '= it.opts.loopRequired, - $ownProperties = it.opts.ownProperties; - if ($breakOnError) { - out += ' var missing' + ($lvl) + '; '; - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - out += ' var ' + ($valid) + ' = true; '; - if ($isData) { - out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += '; if (!' + ($valid) + ') break; } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } else { - out += ' if ( '; - var arr2 = $required; - if (arr2) { - var $propertyKey, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $propertyKey = arr2[$i += 1]; - if ($i) { - out += ' || '; - } - var $prop = it.util.getProperty($propertyKey), - $useData = $data + $prop; - out += ' ( ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; - } - } - out += ') { '; - var $propertyPath = 'missing' + $lvl, - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } - } else { - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - if ($isData) { - out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; - if ($isData) { - out += ' } '; - } - } else { - var arr3 = $required; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $prop = it.util.getProperty($propertyKey), - $missingProperty = it.util.escapeQuotes($propertyKey), - $useData = $data + $prop; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; - } - } - } - } - it.errorPath = $currentErrorPath; - } else if ($breakOnError) { - out += ' if (true) {'; - } - return out; -} - -},{}],48:[function(require,module,exports){ -'use strict'; -module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (($schema || $isData) && it.opts.uniqueItems !== false) { - if ($isData) { - out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; - } - out += ' var ' + ($valid) + ' = true; if (' + ($data) + '.length > 1) { var i = ' + ($data) + '.length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} - -},{}],49:[function(require,module,exports){ -'use strict'; -module.exports = function generate_validate(it, $keyword, $ruleType) { - var out = ''; - var $async = it.schema.$async === true, - $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), - $id = it.self._getId(it.schema); - if (it.isTop) { - if ($async) { - it.async = true; - var $es7 = it.opts.async == 'es7'; - it.yieldAwait = $es7 ? 'await' : 'yield'; - } - out += ' var validate = '; - if ($async) { - if ($es7) { - out += ' (async function '; - } else { - if (it.opts.async != '*') { - out += 'co.wrap'; - } - out += '(function* '; - } - } else { - out += ' (function '; - } - out += ' (data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; - if ($id && (it.opts.sourceCode || it.opts.processCode)) { - out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; - } - } - if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { - var $keyword = 'false schema'; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - if (it.schema === false) { - if (it.isTop) { - $breakOnError = true; - } else { - out += ' var ' + ($valid) + ' = false; '; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'boolean schema is false\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } else { - if (it.isTop) { - if ($async) { - out += ' return data; '; - } else { - out += ' validate.errors = null; return true; '; - } - } else { - out += ' var ' + ($valid) + ' = true; '; - } - } - if (it.isTop) { - out += ' }); return validate; '; - } - return out; - } - if (it.isTop) { - var $top = it.isTop, - $lvl = it.level = 0, - $dataLvl = it.dataLevel = 0, - $data = 'data'; - it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); - it.baseId = it.baseId || it.rootId; - delete it.isTop; - it.dataPathArr = [undefined]; - out += ' var vErrors = null; '; - out += ' var errors = 0; '; - out += ' if (rootData === undefined) rootData = data; '; - } else { - var $lvl = it.level, - $dataLvl = it.dataLevel, - $data = 'data' + ($dataLvl || ''); - if ($id) it.baseId = it.resolve.url(it.baseId, $id); - if ($async && !it.async) throw new Error('async schema in sync schema'); - out += ' var errs_' + ($lvl) + ' = errors;'; - } - var $valid = 'valid' + $lvl, - $breakOnError = !it.opts.allErrors, - $closingBraces1 = '', - $closingBraces2 = ''; - var $errorKeyword; - var $typeSchema = it.schema.type, - $typeIsArray = Array.isArray($typeSchema); - if ($typeIsArray && $typeSchema.length == 1) { - $typeSchema = $typeSchema[0]; - $typeIsArray = false; - } - if (it.schema.$ref && $refKeywords) { - if (it.opts.extendRefs == 'fail') { - throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); - } else if (it.opts.extendRefs !== true) { - $refKeywords = false; - it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); - } - } - if ($typeSchema) { - if (it.opts.coerceTypes) { - var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); - } - var $rulesGroup = it.RULES.types[$typeSchema]; - if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type', - $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; - out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { '; - if ($coerceToTypes) { - var $dataType = 'dataType' + $lvl, - $coerced = 'coerced' + $lvl; - out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; '; - if (it.opts.coerceTypes == 'array') { - out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \'array\'; '; - } - out += ' var ' + ($coerced) + ' = undefined; '; - var $bracesCoercion = ''; - var arr1 = $coerceToTypes; - if (arr1) { - var $type, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $type = arr1[$i += 1]; - if ($i) { - out += ' if (' + ($coerced) + ' === undefined) { '; - $bracesCoercion += '}'; - } - if (it.opts.coerceTypes == 'array' && $type != 'array') { - out += ' if (' + ($dataType) + ' == \'array\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } '; - } - if ($type == 'string') { - out += ' if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; - } else if ($type == 'number' || $type == 'integer') { - out += ' if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; - if ($type == 'integer') { - out += ' && !(' + ($data) + ' % 1)'; - } - out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; - } else if ($type == 'boolean') { - out += ' if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; - } else if ($type == 'null') { - out += ' if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; - } else if (it.opts.coerceTypes == 'array' && $type == 'array') { - out += ' if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; - } - } - } - out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' ' + ($data) + ' = ' + ($coerced) + '; '; - if (!$dataLvl) { - out += 'if (' + ($parentData) + ' !== undefined)'; - } - out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } - out += ' } '; - } - } - if (it.schema.$ref && !$refKeywords) { - out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; - if ($breakOnError) { - out += ' } if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } else { - if (it.opts.v5 && it.schema.patternGroups) { - it.logger.warn('keyword "patternGroups" is deprecated and disabled. Use option patternGroups: true to enable.'); - } - var arr2 = it.RULES; - if (arr2) { - var $rulesGroup, i2 = -1, - l2 = arr2.length - 1; - while (i2 < l2) { - $rulesGroup = arr2[i2 += 1]; - if ($shouldUseGroup($rulesGroup)) { - if ($rulesGroup.type) { - out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { '; - } - if (it.opts.useDefaults && !it.compositeRule) { - if ($rulesGroup.type == 'object' && it.schema.properties) { - var $schema = it.schema.properties, - $schemaKeys = Object.keys($schema); - var arr3 = $schemaKeys; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $sch = $schema[$propertyKey]; - if ($sch.default !== undefined) { - var $passData = $data + it.util.getProperty($propertyKey); - out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { - var arr4 = it.schema.items; - if (arr4) { - var $sch, $i = -1, - l4 = arr4.length - 1; - while ($i < l4) { - $sch = arr4[$i += 1]; - if ($sch.default !== undefined) { - var $passData = $data + '[' + $i + ']'; - out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } - } - var arr5 = $rulesGroup.rules; - if (arr5) { - var $rule, i5 = -1, - l5 = arr5.length - 1; - while (i5 < l5) { - $rule = arr5[i5 += 1]; - if ($shouldUseRule($rule)) { - var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); - if ($code) { - out += ' ' + ($code) + ' '; - if ($breakOnError) { - $closingBraces1 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces1) + ' '; - $closingBraces1 = ''; - } - if ($rulesGroup.type) { - out += ' } '; - if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { - out += ' else { '; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - } - } - if ($breakOnError) { - out += ' if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces2) + ' '; - } - if ($top) { - if ($async) { - out += ' if (errors === 0) return data; '; - out += ' else throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; '; - out += ' return errors === 0; '; - } - out += ' }); return validate;'; - } else { - out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; - } - out = it.util.cleanUpCode(out); - if ($top) { - out = it.util.finalCleanUpCode(out, $async); - } - - function $shouldUseGroup($rulesGroup) { - var rules = $rulesGroup.rules; - for (var i = 0; i < rules.length; i++) - if ($shouldUseRule(rules[i])) return true; - } - - function $shouldUseRule($rule) { - return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); - } - - function $ruleImplementsSomeKeyword($rule) { - var impl = $rule.implements; - for (var i = 0; i < impl.length; i++) - if (it.schema[impl[i]] !== undefined) return true; - } - return out; -} - -},{}],50:[function(require,module,exports){ -'use strict'; - -var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; -var customRuleCode = require('./dotjs/custom'); - -module.exports = { - add: addKeyword, - get: getKeyword, - remove: removeKeyword -}; - -/** - * Define custom keyword - * @this Ajv - * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). - * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. - * @return {Ajv} this for method chaining - */ -function addKeyword(keyword, definition) { - /* jshint validthis: true */ - /* eslint no-shadow: 0 */ - var RULES = this.RULES; - - if (RULES.keywords[keyword]) - throw new Error('Keyword ' + keyword + ' is already defined'); - - if (!IDENTIFIER.test(keyword)) - throw new Error('Keyword ' + keyword + ' is not a valid identifier'); - - if (definition) { - if (definition.macro && definition.valid !== undefined) - throw new Error('"valid" option cannot be used with macro keywords'); - - var dataType = definition.type; - if (Array.isArray(dataType)) { - var i, len = dataType.length; - for (i=0; i All rights reserved. - - -module.exports = { - - newInvalidAsn1Error: function(msg) { - var e = new Error(); - e.name = 'InvalidAsn1Error'; - e.message = msg || ''; - return e; - } - -}; - -},{}],55:[function(require,module,exports){ -// Copyright 2011 Mark Cavage All rights reserved. - -var errors = require('./errors'); -var types = require('./types'); - -var Reader = require('./reader'); -var Writer = require('./writer'); - - -///--- Exports - -module.exports = { - - Reader: Reader, - - Writer: Writer - -}; - -for (var t in types) { - if (types.hasOwnProperty(t)) - module.exports[t] = types[t]; -} -for (var e in errors) { - if (errors.hasOwnProperty(e)) - module.exports[e] = errors[e]; -} - -},{"./errors":54,"./reader":56,"./types":57,"./writer":58}],56:[function(require,module,exports){ -// Copyright 2011 Mark Cavage All rights reserved. - -var assert = require('assert'); - -var ASN1 = require('./types'); -var errors = require('./errors'); - - -///--- Globals - -var newInvalidAsn1Error = errors.newInvalidAsn1Error; - - - -///--- API - -function Reader(data) { - if (!data || !Buffer.isBuffer(data)) - throw new TypeError('data must be a node Buffer'); - - this._buf = data; - this._size = data.length; - - // These hold the "current" state - this._len = 0; - this._offset = 0; -} - -Object.defineProperty(Reader.prototype, 'length', { - enumerable: true, - get: function () { return (this._len); } -}); - -Object.defineProperty(Reader.prototype, 'offset', { - enumerable: true, - get: function () { return (this._offset); } -}); - -Object.defineProperty(Reader.prototype, 'remain', { - get: function () { return (this._size - this._offset); } -}); - -Object.defineProperty(Reader.prototype, 'buffer', { - get: function () { return (this._buf.slice(this._offset)); } -}); - - -/** - * Reads a single byte and advances offset; you can pass in `true` to make this - * a "peek" operation (i.e., get the byte, but don't advance the offset). - * - * @param {Boolean} peek true means don't move offset. - * @return {Number} the next byte, null if not enough data. - */ -Reader.prototype.readByte = function(peek) { - if (this._size - this._offset < 1) - return null; - - var b = this._buf[this._offset] & 0xff; - - if (!peek) - this._offset += 1; - - return b; -}; - - -Reader.prototype.peek = function() { - return this.readByte(true); -}; - - -/** - * Reads a (potentially) variable length off the BER buffer. This call is - * not really meant to be called directly, as callers have to manipulate - * the internal buffer afterwards. - * - * As a result of this call, you can call `Reader.length`, until the - * next thing called that does a readLength. - * - * @return {Number} the amount of offset to advance the buffer. - * @throws {InvalidAsn1Error} on bad ASN.1 - */ -Reader.prototype.readLength = function(offset) { - if (offset === undefined) - offset = this._offset; - - if (offset >= this._size) - return null; - - var lenB = this._buf[offset++] & 0xff; - if (lenB === null) - return null; - - if ((lenB & 0x80) == 0x80) { - lenB &= 0x7f; - - if (lenB == 0) - throw newInvalidAsn1Error('Indefinite length not supported'); - - if (lenB > 4) - throw newInvalidAsn1Error('encoding too long'); - - if (this._size - offset < lenB) - return null; - - this._len = 0; - for (var i = 0; i < lenB; i++) - this._len = (this._len << 8) + (this._buf[offset++] & 0xff); - - } else { - // Wasn't a variable length - this._len = lenB; - } - - return offset; -}; - - -/** - * Parses the next sequence in this BER buffer. - * - * To get the length of the sequence, call `Reader.length`. - * - * @return {Number} the sequence's tag. - */ -Reader.prototype.readSequence = function(tag) { - var seq = this.peek(); - if (seq === null) - return null; - if (tag !== undefined && tag !== seq) - throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + - ': got 0x' + seq.toString(16)); - - var o = this.readLength(this._offset + 1); // stored in `length` - if (o === null) - return null; - - this._offset = o; - return seq; -}; - - -Reader.prototype.readInt = function() { - return this._readTag(ASN1.Integer); -}; - - -Reader.prototype.readBoolean = function() { - return (this._readTag(ASN1.Boolean) === 0 ? false : true); -}; - - -Reader.prototype.readEnumeration = function() { - return this._readTag(ASN1.Enumeration); -}; - - -Reader.prototype.readString = function(tag, retbuf) { - if (!tag) - tag = ASN1.OctetString; - - var b = this.peek(); - if (b === null) - return null; - - if (b !== tag) - throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + - ': got 0x' + b.toString(16)); - - var o = this.readLength(this._offset + 1); // stored in `length` - - if (o === null) - return null; - - if (this.length > this._size - o) - return null; - - this._offset = o; - - if (this.length === 0) - return retbuf ? new Buffer(0) : ''; - - var str = this._buf.slice(this._offset, this._offset + this.length); - this._offset += this.length; - - return retbuf ? str : str.toString('utf8'); -}; - -Reader.prototype.readOID = function(tag) { - if (!tag) - tag = ASN1.OID; - - var b = this.readString(tag, true); - if (b === null) - return null; - - var values = []; - var value = 0; - - for (var i = 0; i < b.length; i++) { - var byte = b[i] & 0xff; - - value <<= 7; - value += byte & 0x7f; - if ((byte & 0x80) == 0) { - values.push(value); - value = 0; - } - } - - value = values.shift(); - values.unshift(value % 40); - values.unshift((value / 40) >> 0); - - return values.join('.'); -}; - - -Reader.prototype._readTag = function(tag) { - assert.ok(tag !== undefined); - - var b = this.peek(); - - if (b === null) - return null; - - if (b !== tag) - throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + - ': got 0x' + b.toString(16)); - - var o = this.readLength(this._offset + 1); // stored in `length` - if (o === null) - return null; - - if (this.length > 4) - throw newInvalidAsn1Error('Integer too long: ' + this.length); - - if (this.length > this._size - o) - return null; - this._offset = o; - - var fb = this._buf[this._offset]; - var value = 0; - - for (var i = 0; i < this.length; i++) { - value <<= 8; - value |= (this._buf[this._offset++] & 0xff); - } - - if ((fb & 0x80) == 0x80 && i !== 4) - value -= (1 << (i * 8)); - - return value >> 0; -}; - - - -///--- Exported API - -module.exports = Reader; - -},{"./errors":54,"./types":57,"assert":undefined}],57:[function(require,module,exports){ -// Copyright 2011 Mark Cavage All rights reserved. - - -module.exports = { - EOC: 0, - Boolean: 1, - Integer: 2, - BitString: 3, - OctetString: 4, - Null: 5, - OID: 6, - ObjectDescriptor: 7, - External: 8, - Real: 9, // float - Enumeration: 10, - PDV: 11, - Utf8String: 12, - RelativeOID: 13, - Sequence: 16, - Set: 17, - NumericString: 18, - PrintableString: 19, - T61String: 20, - VideotexString: 21, - IA5String: 22, - UTCTime: 23, - GeneralizedTime: 24, - GraphicString: 25, - VisibleString: 26, - GeneralString: 28, - UniversalString: 29, - CharacterString: 30, - BMPString: 31, - Constructor: 32, - Context: 128 -}; - -},{}],58:[function(require,module,exports){ -// Copyright 2011 Mark Cavage All rights reserved. - -var assert = require('assert'); -var ASN1 = require('./types'); -var errors = require('./errors'); - - -///--- Globals - -var newInvalidAsn1Error = errors.newInvalidAsn1Error; - -var DEFAULT_OPTS = { - size: 1024, - growthFactor: 8 -}; - - -///--- Helpers - -function merge(from, to) { - assert.ok(from); - assert.equal(typeof(from), 'object'); - assert.ok(to); - assert.equal(typeof(to), 'object'); - - var keys = Object.getOwnPropertyNames(from); - keys.forEach(function(key) { - if (to[key]) - return; - - var value = Object.getOwnPropertyDescriptor(from, key); - Object.defineProperty(to, key, value); - }); - - return to; -} - - - -///--- API - -function Writer(options) { - options = merge(DEFAULT_OPTS, options || {}); - - this._buf = new Buffer(options.size || 1024); - this._size = this._buf.length; - this._offset = 0; - this._options = options; - - // A list of offsets in the buffer where we need to insert - // sequence tag/len pairs. - this._seq = []; -} - -Object.defineProperty(Writer.prototype, 'buffer', { - get: function () { - if (this._seq.length) - throw new InvalidAsn1Error(this._seq.length + ' unended sequence(s)'); - - return (this._buf.slice(0, this._offset)); - } -}); - -Writer.prototype.writeByte = function(b) { - if (typeof(b) !== 'number') - throw new TypeError('argument must be a Number'); - - this._ensure(1); - this._buf[this._offset++] = b; -}; - - -Writer.prototype.writeInt = function(i, tag) { - if (typeof(i) !== 'number') - throw new TypeError('argument must be a Number'); - if (typeof(tag) !== 'number') - tag = ASN1.Integer; - - var sz = 4; - - while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) && - (sz > 1)) { - sz--; - i <<= 8; - } - - if (sz > 4) - throw new InvalidAsn1Error('BER ints cannot be > 0xffffffff'); - - this._ensure(2 + sz); - this._buf[this._offset++] = tag; - this._buf[this._offset++] = sz; - - while (sz-- > 0) { - this._buf[this._offset++] = ((i & 0xff000000) >>> 24); - i <<= 8; - } - -}; - - -Writer.prototype.writeNull = function() { - this.writeByte(ASN1.Null); - this.writeByte(0x00); -}; - - -Writer.prototype.writeEnumeration = function(i, tag) { - if (typeof(i) !== 'number') - throw new TypeError('argument must be a Number'); - if (typeof(tag) !== 'number') - tag = ASN1.Enumeration; - - return this.writeInt(i, tag); -}; - - -Writer.prototype.writeBoolean = function(b, tag) { - if (typeof(b) !== 'boolean') - throw new TypeError('argument must be a Boolean'); - if (typeof(tag) !== 'number') - tag = ASN1.Boolean; - - this._ensure(3); - this._buf[this._offset++] = tag; - this._buf[this._offset++] = 0x01; - this._buf[this._offset++] = b ? 0xff : 0x00; -}; - - -Writer.prototype.writeString = function(s, tag) { - if (typeof(s) !== 'string') - throw new TypeError('argument must be a string (was: ' + typeof(s) + ')'); - if (typeof(tag) !== 'number') - tag = ASN1.OctetString; - - var len = Buffer.byteLength(s); - this.writeByte(tag); - this.writeLength(len); - if (len) { - this._ensure(len); - this._buf.write(s, this._offset); - this._offset += len; - } -}; - - -Writer.prototype.writeBuffer = function(buf, tag) { - if (typeof(tag) !== 'number') - throw new TypeError('tag must be a number'); - if (!Buffer.isBuffer(buf)) - throw new TypeError('argument must be a buffer'); - - this.writeByte(tag); - this.writeLength(buf.length); - this._ensure(buf.length); - buf.copy(this._buf, this._offset, 0, buf.length); - this._offset += buf.length; -}; - - -Writer.prototype.writeStringArray = function(strings) { - if ((!strings instanceof Array)) - throw new TypeError('argument must be an Array[String]'); - - var self = this; - strings.forEach(function(s) { - self.writeString(s); - }); -}; - -// This is really to solve DER cases, but whatever for now -Writer.prototype.writeOID = function(s, tag) { - if (typeof(s) !== 'string') - throw new TypeError('argument must be a string'); - if (typeof(tag) !== 'number') - tag = ASN1.OID; - - if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) - throw new Error('argument is not a valid OID string'); - - function encodeOctet(bytes, octet) { - if (octet < 128) { - bytes.push(octet); - } else if (octet < 16384) { - bytes.push((octet >>> 7) | 0x80); - bytes.push(octet & 0x7F); - } else if (octet < 2097152) { - bytes.push((octet >>> 14) | 0x80); - bytes.push(((octet >>> 7) | 0x80) & 0xFF); - bytes.push(octet & 0x7F); - } else if (octet < 268435456) { - bytes.push((octet >>> 21) | 0x80); - bytes.push(((octet >>> 14) | 0x80) & 0xFF); - bytes.push(((octet >>> 7) | 0x80) & 0xFF); - bytes.push(octet & 0x7F); - } else { - bytes.push(((octet >>> 28) | 0x80) & 0xFF); - bytes.push(((octet >>> 21) | 0x80) & 0xFF); - bytes.push(((octet >>> 14) | 0x80) & 0xFF); - bytes.push(((octet >>> 7) | 0x80) & 0xFF); - bytes.push(octet & 0x7F); - } - } - - var tmp = s.split('.'); - var bytes = []; - bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10)); - tmp.slice(2).forEach(function(b) { - encodeOctet(bytes, parseInt(b, 10)); - }); - - var self = this; - this._ensure(2 + bytes.length); - this.writeByte(tag); - this.writeLength(bytes.length); - bytes.forEach(function(b) { - self.writeByte(b); - }); -}; - - -Writer.prototype.writeLength = function(len) { - if (typeof(len) !== 'number') - throw new TypeError('argument must be a Number'); - - this._ensure(4); - - if (len <= 0x7f) { - this._buf[this._offset++] = len; - } else if (len <= 0xff) { - this._buf[this._offset++] = 0x81; - this._buf[this._offset++] = len; - } else if (len <= 0xffff) { - this._buf[this._offset++] = 0x82; - this._buf[this._offset++] = len >> 8; - this._buf[this._offset++] = len; - } else if (len <= 0xffffff) { - this._buf[this._offset++] = 0x83; - this._buf[this._offset++] = len >> 16; - this._buf[this._offset++] = len >> 8; - this._buf[this._offset++] = len; - } else { - throw new InvalidAsn1ERror('Length too long (> 4 bytes)'); - } -}; - -Writer.prototype.startSequence = function(tag) { - if (typeof(tag) !== 'number') - tag = ASN1.Sequence | ASN1.Constructor; - - this.writeByte(tag); - this._seq.push(this._offset); - this._ensure(3); - this._offset += 3; -}; - - -Writer.prototype.endSequence = function() { - var seq = this._seq.pop(); - var start = seq + 3; - var len = this._offset - start; - - if (len <= 0x7f) { - this._shift(start, len, -2); - this._buf[seq] = len; - } else if (len <= 0xff) { - this._shift(start, len, -1); - this._buf[seq] = 0x81; - this._buf[seq + 1] = len; - } else if (len <= 0xffff) { - this._buf[seq] = 0x82; - this._buf[seq + 1] = len >> 8; - this._buf[seq + 2] = len; - } else if (len <= 0xffffff) { - this._shift(start, len, 1); - this._buf[seq] = 0x83; - this._buf[seq + 1] = len >> 16; - this._buf[seq + 2] = len >> 8; - this._buf[seq + 3] = len; - } else { - throw new InvalidAsn1Error('Sequence too long'); - } -}; - - -Writer.prototype._shift = function(start, len, shift) { - assert.ok(start !== undefined); - assert.ok(len !== undefined); - assert.ok(shift); - - this._buf.copy(this._buf, start + shift, start, start + len); - this._offset += shift; -}; - -Writer.prototype._ensure = function(len) { - assert.ok(len); - - if (this._size - this._offset < len) { - var sz = this._size * this._options.growthFactor; - if (sz - this._offset < len) - sz += len; - - var buf = new Buffer(sz); - - this._buf.copy(buf, 0, 0, this._offset); - this._buf = buf; - this._size = sz; - } -}; - - - -///--- Exported API - -module.exports = Writer; - -},{"./errors":54,"./types":57,"assert":undefined}],59:[function(require,module,exports){ -// Copyright 2011 Mark Cavage All rights reserved. - -// If you have no idea what ASN.1 or BER is, see this: -// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc - -var Ber = require('./ber/index'); - - - -///--- Exported API - -module.exports = { - - Ber: Ber, - - BerReader: Ber.Reader, - - BerWriter: Ber.Writer - -}; - -},{"./ber/index":55}],60:[function(require,module,exports){ -module.exports = -{ - parallel : require('./parallel.js'), - serial : require('./serial.js'), - serialOrdered : require('./serialOrdered.js') -}; - -},{"./parallel.js":67,"./serial.js":68,"./serialOrdered.js":69}],61:[function(require,module,exports){ -// API -module.exports = abort; - -/** - * Aborts leftover active jobs - * - * @param {object} state - current state object - */ -function abort(state) -{ - Object.keys(state.jobs).forEach(clean.bind(state)); - - // reset leftover jobs - state.jobs = {}; -} - -/** - * Cleans up leftover job by invoking abort function for the provided job id - * - * @this state - * @param {string|number} key - job id to abort - */ -function clean(key) -{ - if (typeof this.jobs[key] == 'function') - { - this.jobs[key](); - } -} - -},{}],62:[function(require,module,exports){ -var defer = require('./defer.js'); - -// API -module.exports = async; - -/** - * Runs provided callback asynchronously - * even if callback itself is not - * - * @param {function} callback - callback to invoke - * @returns {function} - augmented callback - */ -function async(callback) -{ - var isAsync = false; - - // check if async happened - defer(function() { isAsync = true; }); - - return function async_callback(err, result) - { - if (isAsync) - { - callback(err, result); - } - else - { - defer(function nextTick_callback() - { - callback(err, result); - }); - } - }; -} - -},{"./defer.js":63}],63:[function(require,module,exports){ -module.exports = defer; - -/** - * Runs provided function on next iteration of the event loop - * - * @param {function} fn - function to run - */ -function defer(fn) -{ - var nextTick = typeof setImmediate == 'function' - ? setImmediate - : ( - typeof process == 'object' && typeof process.nextTick == 'function' - ? process.nextTick - : null - ); - - if (nextTick) - { - nextTick(fn); - } - else - { - setTimeout(fn, 0); - } -} - -},{}],64:[function(require,module,exports){ -var async = require('./async.js') - , abort = require('./abort.js') - ; - -// API -module.exports = iterate; - -/** - * Iterates over each job object - * - * @param {array|object} list - array or object (named list) to iterate over - * @param {function} iterator - iterator to run - * @param {object} state - current job status - * @param {function} callback - invoked when all elements processed - */ -function iterate(list, iterator, state, callback) -{ - // store current index - var key = state['keyedList'] ? state['keyedList'][state.index] : state.index; - - state.jobs[key] = runJob(iterator, key, list[key], function(error, output) - { - // don't repeat yourself - // skip secondary callbacks - if (!(key in state.jobs)) - { - return; - } - - // clean up jobs - delete state.jobs[key]; - - if (error) - { - // don't process rest of the results - // stop still active jobs - // and reset the list - abort(state); - } - else - { - state.results[key] = output; - } - - // return salvaged results - callback(error, state.results); - }); -} - -/** - * Runs iterator over provided job element - * - * @param {function} iterator - iterator to invoke - * @param {string|number} key - key/index of the element in the list of jobs - * @param {mixed} item - job description - * @param {function} callback - invoked after iterator is done with the job - * @returns {function|mixed} - job abort function or something else - */ -function runJob(iterator, key, item, callback) -{ - var aborter; - - // allow shortcut if iterator expects only two arguments - if (iterator.length == 2) - { - aborter = iterator(item, async(callback)); - } - // otherwise go with full three arguments - else - { - aborter = iterator(item, key, async(callback)); - } - - return aborter; -} - -},{"./abort.js":61,"./async.js":62}],65:[function(require,module,exports){ -// API -module.exports = state; - -/** - * Creates initial state object - * for iteration over list - * - * @param {array|object} list - list to iterate over - * @param {function|null} sortMethod - function to use for keys sort, - * or `null` to keep them as is - * @returns {object} - initial state object - */ -function state(list, sortMethod) -{ - var isNamedList = !Array.isArray(list) - , initState = - { - index : 0, - keyedList: isNamedList || sortMethod ? Object.keys(list) : null, - jobs : {}, - results : isNamedList ? {} : [], - size : isNamedList ? Object.keys(list).length : list.length - } - ; - - if (sortMethod) - { - // sort array keys based on it's values - // sort object's keys just on own merit - initState.keyedList.sort(isNamedList ? sortMethod : function(a, b) - { - return sortMethod(list[a], list[b]); - }); - } - - return initState; -} - -},{}],66:[function(require,module,exports){ -var abort = require('./abort.js') - , async = require('./async.js') - ; - -// API -module.exports = terminator; - -/** - * Terminates jobs in the attached state context - * - * @this AsyncKitState# - * @param {function} callback - final callback to invoke after termination - */ -function terminator(callback) -{ - if (!Object.keys(this.jobs).length) - { - return; - } - - // fast forward iteration index - this.index = this.size; - - // abort jobs - abort(this); - - // send back results we have so far - async(callback)(null, this.results); -} - -},{"./abort.js":61,"./async.js":62}],67:[function(require,module,exports){ -var iterate = require('./lib/iterate.js') - , initState = require('./lib/state.js') - , terminator = require('./lib/terminator.js') - ; - -// Public API -module.exports = parallel; - -/** - * Runs iterator over provided array elements in parallel - * - * @param {array|object} list - array or object (named list) to iterate over - * @param {function} iterator - iterator to run - * @param {function} callback - invoked when all elements processed - * @returns {function} - jobs terminator - */ -function parallel(list, iterator, callback) -{ - var state = initState(list); - - while (state.index < (state['keyedList'] || list).length) - { - iterate(list, iterator, state, function(error, result) - { - if (error) - { - callback(error, result); - return; - } - - // looks like it's the last one - if (Object.keys(state.jobs).length === 0) - { - callback(null, state.results); - return; - } - }); - - state.index++; - } - - return terminator.bind(state, callback); -} - -},{"./lib/iterate.js":64,"./lib/state.js":65,"./lib/terminator.js":66}],68:[function(require,module,exports){ -var serialOrdered = require('./serialOrdered.js'); - -// Public API -module.exports = serial; - -/** - * Runs iterator over provided array elements in series - * - * @param {array|object} list - array or object (named list) to iterate over - * @param {function} iterator - iterator to run - * @param {function} callback - invoked when all elements processed - * @returns {function} - jobs terminator - */ -function serial(list, iterator, callback) -{ - return serialOrdered(list, iterator, null, callback); -} - -},{"./serialOrdered.js":69}],69:[function(require,module,exports){ -var iterate = require('./lib/iterate.js') - , initState = require('./lib/state.js') - , terminator = require('./lib/terminator.js') - ; - -// Public API -module.exports = serialOrdered; -// sorting helpers -module.exports.ascending = ascending; -module.exports.descending = descending; - -/** - * Runs iterator over provided sorted array elements in series - * - * @param {array|object} list - array or object (named list) to iterate over - * @param {function} iterator - iterator to run - * @param {function} sortMethod - custom sort function - * @param {function} callback - invoked when all elements processed - * @returns {function} - jobs terminator - */ -function serialOrdered(list, iterator, sortMethod, callback) -{ - var state = initState(list, sortMethod); - - iterate(list, iterator, state, function iteratorHandler(error, result) - { - if (error) - { - callback(error, result); - return; - } - - state.index++; - - // are we there yet? - if (state.index < (state['keyedList'] || list).length) - { - iterate(list, iterator, state, iteratorHandler); - return; - } - - // done here - callback(null, state.results); - }); - - return terminator.bind(state, callback); -} - -/* - * -- Sort methods - */ - -/** - * sort helper to sort array elements in ascending order - * - * @param {mixed} a - an item to compare - * @param {mixed} b - an item to compare - * @returns {number} - comparison result - */ -function ascending(a, b) -{ - return a < b ? -1 : a > b ? 1 : 0; -} - -/** - * sort helper to sort array elements in descending order - * - * @param {mixed} a - an item to compare - * @param {mixed} b - an item to compare - * @returns {number} - comparison result - */ -function descending(a, b) -{ - return -1 * ascending(a, b); -} - -},{"./lib/iterate.js":64,"./lib/state.js":65,"./lib/terminator.js":66}],70:[function(require,module,exports){ -var aws4 = exports, - url = require('url'), - querystring = require('querystring'), - crypto = require('crypto'), - lru = require('./lru'), - credentialsCache = lru(1000) - -// http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html - -function hmac(key, string, encoding) { - return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding) -} - -function hash(string, encoding) { - return crypto.createHash('sha256').update(string, 'utf8').digest(encoding) -} - -// This function assumes the string has already been percent encoded -function encodeRfc3986(urlEncodedString) { - return urlEncodedString.replace(/[!'()*]/g, function(c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase() - }) -} - -// request: { path | body, [host], [method], [headers], [service], [region] } -// credentials: { accessKeyId, secretAccessKey, [sessionToken] } -function RequestSigner(request, credentials) { - - if (typeof request === 'string') request = url.parse(request) - - var headers = request.headers = (request.headers || {}), - hostParts = this.matchHost(request.hostname || request.host || headers.Host || headers.host) - - this.request = request - this.credentials = credentials || this.defaultCredentials() - - this.service = request.service || hostParts[0] || '' - this.region = request.region || hostParts[1] || 'us-east-1' - - // SES uses a different domain from the service name - if (this.service === 'email') this.service = 'ses' - - if (!request.method && request.body) - request.method = 'POST' - - if (!headers.Host && !headers.host) { - headers.Host = request.hostname || request.host || this.createHost() - - // If a port is specified explicitly, use it as is - if (request.port) - headers.Host += ':' + request.port - } - if (!request.hostname && !request.host) - request.hostname = headers.Host || headers.host - - this.isCodeCommitGit = this.service === 'codecommit' && request.method === 'GIT' -} - -RequestSigner.prototype.matchHost = function(host) { - var match = (host || '').match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com$/) - var hostParts = (match || []).slice(1, 3) - - // ES's hostParts are sometimes the other way round, if the value that is expected - // to be region equals ‘es’ switch them back - // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com - if (hostParts[1] === 'es') - hostParts = hostParts.reverse() - - return hostParts -} - -// http://docs.aws.amazon.com/general/latest/gr/rande.html -RequestSigner.prototype.isSingleRegion = function() { - // Special case for S3 and SimpleDB in us-east-1 - if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true - - return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts'] - .indexOf(this.service) >= 0 -} - -RequestSigner.prototype.createHost = function() { - var region = this.isSingleRegion() ? '' : - (this.service === 's3' && this.region !== 'us-east-1' ? '-' : '.') + this.region, - service = this.service === 'ses' ? 'email' : this.service - return service + region + '.amazonaws.com' -} - -RequestSigner.prototype.prepareRequest = function() { - this.parsePath() - - var request = this.request, headers = request.headers, query - - if (request.signQuery) { - - this.parsedPath.query = query = this.parsedPath.query || {} - - if (this.credentials.sessionToken) - query['X-Amz-Security-Token'] = this.credentials.sessionToken - - if (this.service === 's3' && !query['X-Amz-Expires']) - query['X-Amz-Expires'] = 86400 - - if (query['X-Amz-Date']) - this.datetime = query['X-Amz-Date'] - else - query['X-Amz-Date'] = this.getDateTime() - - query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256' - query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString() - query['X-Amz-SignedHeaders'] = this.signedHeaders() - - } else { - - if (!request.doNotModifyHeaders && !this.isCodeCommitGit) { - if (request.body && !headers['Content-Type'] && !headers['content-type']) - headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' - - if (request.body && !headers['Content-Length'] && !headers['content-length']) - headers['Content-Length'] = Buffer.byteLength(request.body) - - if (this.credentials.sessionToken && !headers['X-Amz-Security-Token'] && !headers['x-amz-security-token']) - headers['X-Amz-Security-Token'] = this.credentials.sessionToken - - if (this.service === 's3' && !headers['X-Amz-Content-Sha256'] && !headers['x-amz-content-sha256']) - headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex') - - if (headers['X-Amz-Date'] || headers['x-amz-date']) - this.datetime = headers['X-Amz-Date'] || headers['x-amz-date'] - else - headers['X-Amz-Date'] = this.getDateTime() - } - - delete headers.Authorization - delete headers.authorization - } -} - -RequestSigner.prototype.sign = function() { - if (!this.parsedPath) this.prepareRequest() - - if (this.request.signQuery) { - this.parsedPath.query['X-Amz-Signature'] = this.signature() - } else { - this.request.headers.Authorization = this.authHeader() - } - - this.request.path = this.formatPath() - - return this.request -} - -RequestSigner.prototype.getDateTime = function() { - if (!this.datetime) { - var headers = this.request.headers, - date = new Date(headers.Date || headers.date || new Date) - - this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, '') - - // Remove the trailing 'Z' on the timestamp string for CodeCommit git access - if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1) - } - return this.datetime -} - -RequestSigner.prototype.getDate = function() { - return this.getDateTime().substr(0, 8) -} - -RequestSigner.prototype.authHeader = function() { - return [ - 'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(), - 'SignedHeaders=' + this.signedHeaders(), - 'Signature=' + this.signature(), - ].join(', ') -} - -RequestSigner.prototype.signature = function() { - var date = this.getDate(), - cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(), - kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey) - if (!kCredentials) { - kDate = hmac('AWS4' + this.credentials.secretAccessKey, date) - kRegion = hmac(kDate, this.region) - kService = hmac(kRegion, this.service) - kCredentials = hmac(kService, 'aws4_request') - credentialsCache.set(cacheKey, kCredentials) - } - return hmac(kCredentials, this.stringToSign(), 'hex') -} - -RequestSigner.prototype.stringToSign = function() { - return [ - 'AWS4-HMAC-SHA256', - this.getDateTime(), - this.credentialString(), - hash(this.canonicalString(), 'hex'), - ].join('\n') -} - -RequestSigner.prototype.canonicalString = function() { - if (!this.parsedPath) this.prepareRequest() - - var pathStr = this.parsedPath.path, - query = this.parsedPath.query, - headers = this.request.headers, - queryStr = '', - normalizePath = this.service !== 's3', - decodePath = this.service === 's3' || this.request.doNotEncodePath, - decodeSlashesInPath = this.service === 's3', - firstValOnly = this.service === 's3', - bodyHash - - if (this.service === 's3' && this.request.signQuery) { - bodyHash = 'UNSIGNED-PAYLOAD' - } else if (this.isCodeCommitGit) { - bodyHash = '' - } else { - bodyHash = headers['X-Amz-Content-Sha256'] || headers['x-amz-content-sha256'] || - hash(this.request.body || '', 'hex') - } - - if (query) { - queryStr = encodeRfc3986(querystring.stringify(Object.keys(query).sort().reduce(function(obj, key) { - if (!key) return obj - obj[key] = !Array.isArray(query[key]) ? query[key] : - (firstValOnly ? query[key][0] : query[key].slice().sort()) - return obj - }, {}))) - } - if (pathStr !== '/') { - if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, '/') - pathStr = pathStr.split('/').reduce(function(path, piece) { - if (normalizePath && piece === '..') { - path.pop() - } else if (!normalizePath || piece !== '.') { - if (decodePath) piece = querystring.unescape(piece) - path.push(encodeRfc3986(querystring.escape(piece))) - } - return path - }, []).join('/') - if (pathStr[0] !== '/') pathStr = '/' + pathStr - if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/') - } - - return [ - this.request.method || 'GET', - pathStr, - queryStr, - this.canonicalHeaders() + '\n', - this.signedHeaders(), - bodyHash, - ].join('\n') -} - -RequestSigner.prototype.canonicalHeaders = function() { - var headers = this.request.headers - function trimAll(header) { - return header.toString().trim().replace(/\s+/g, ' ') - } - return Object.keys(headers) - .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 }) - .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) }) - .join('\n') -} - -RequestSigner.prototype.signedHeaders = function() { - return Object.keys(this.request.headers) - .map(function(key) { return key.toLowerCase() }) - .sort() - .join(';') -} - -RequestSigner.prototype.credentialString = function() { - return [ - this.getDate(), - this.region, - this.service, - 'aws4_request', - ].join('/') -} - -RequestSigner.prototype.defaultCredentials = function() { - var env = process.env - return { - accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY, - secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY, - sessionToken: env.AWS_SESSION_TOKEN, - } -} - -RequestSigner.prototype.parsePath = function() { - var path = this.request.path || '/', - queryIx = path.indexOf('?'), - query = null - - if (queryIx >= 0) { - query = querystring.parse(path.slice(queryIx + 1)) - path = path.slice(0, queryIx) - } - - // S3 doesn't always encode characters > 127 correctly and - // all services don't encode characters > 255 correctly - // So if there are non-reserved chars (and it's not already all % encoded), just encode them all - if (/[^0-9A-Za-z!'()*\-._~%/]/.test(path)) { - path = path.split('/').map(function(piece) { - return querystring.escape(querystring.unescape(piece)) - }).join('/') - } - - this.parsedPath = { - path: path, - query: query, - } -} - -RequestSigner.prototype.formatPath = function() { - var path = this.parsedPath.path, - query = this.parsedPath.query - - if (!query) return path - - // Services don't support empty query string keys - if (query[''] != null) delete query[''] - - return path + '?' + encodeRfc3986(querystring.stringify(query)) -} - -aws4.RequestSigner = RequestSigner - -aws4.sign = function(request, credentials) { - return new RequestSigner(request, credentials).sign() -} - -},{"./lru":71,"crypto":undefined,"querystring":undefined,"url":undefined}],71:[function(require,module,exports){ -module.exports = function(size) { - return new LruCache(size) -} - -function LruCache(size) { - this.capacity = size | 0 - this.map = Object.create(null) - this.list = new DoublyLinkedList() -} - -LruCache.prototype.get = function(key) { - var node = this.map[key] - if (node == null) return undefined - this.used(node) - return node.val -} - -LruCache.prototype.set = function(key, val) { - var node = this.map[key] - if (node != null) { - node.val = val - } else { - if (!this.capacity) this.prune() - if (!this.capacity) return false - node = new DoublyLinkedNode(key, val) - this.map[key] = node - this.capacity-- - } - this.used(node) - return true -} - -LruCache.prototype.used = function(node) { - this.list.moveToFront(node) -} - -LruCache.prototype.prune = function() { - var node = this.list.pop() - if (node != null) { - delete this.map[node.key] - this.capacity++ - } -} - - -function DoublyLinkedList() { - this.firstNode = null - this.lastNode = null -} - -DoublyLinkedList.prototype.moveToFront = function(node) { - if (this.firstNode == node) return - - this.remove(node) - - if (this.firstNode == null) { - this.firstNode = node - this.lastNode = node - node.prev = null - node.next = null - } else { - node.prev = null - node.next = this.firstNode - node.next.prev = node - this.firstNode = node - } -} - -DoublyLinkedList.prototype.pop = function() { - var lastNode = this.lastNode - if (lastNode != null) { - this.remove(lastNode) - } - return lastNode -} - -DoublyLinkedList.prototype.remove = function(node) { - if (this.firstNode == node) { - this.firstNode = node.next - } else if (node.prev != null) { - node.prev.next = node.next - } - if (this.lastNode == node) { - this.lastNode = node.prev - } else if (node.next != null) { - node.next.prev = node.prev - } -} - - -function DoublyLinkedNode(key, val) { - this.key = key - this.val = val - this.prev = null - this.next = null -} - -},{}],72:[function(require,module,exports){ -'use strict'; - -var crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash; - -/* - * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a - * result, it retains the original copyright and license. The two files are - * under slightly different (but compatible) licenses, and are here combined in - * one file. - * - * Credit for the actual porting work goes to: - * Devi Mandiri - */ - -/* - * The Blowfish portions are under the following license: - * - * Blowfish block cipher for OpenBSD - * Copyright 1997 Niels Provos - * All rights reserved. - * - * Implementation advice by David Mazieres . - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * The bcrypt_pbkdf portions are under the following license: - * - * Copyright (c) 2013 Ted Unangst - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * Performance improvements (Javascript-specific): - * - * Copyright 2016, Joyent Inc - * Author: Alex Wilson - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -// Ported from OpenBSD bcrypt_pbkdf.c v1.9 - -var BLF_J = 0; - -var Blowfish = function() { - this.S = [ - new Uint32Array([ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, - 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, - 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, - 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, - 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, - 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, - 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, - 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, - 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, - 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, - 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, - 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, - 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, - 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, - 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, - 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, - 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, - 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, - 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, - 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, - 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, - 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, - 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, - 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, - 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, - 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, - 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, - 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, - 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, - 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, - 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, - 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, - 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, - 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, - 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, - 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, - 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, - 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, - 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, - 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, - 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, - 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]), - new Uint32Array([ - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, - 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, - 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, - 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, - 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, - 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, - 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, - 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, - 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, - 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, - 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, - 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, - 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, - 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, - 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, - 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, - 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, - 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, - 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, - 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, - 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, - 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, - 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, - 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, - 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, - 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, - 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, - 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, - 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, - 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, - 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, - 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, - 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, - 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, - 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, - 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, - 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, - 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, - 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, - 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, - 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, - 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, - 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, - 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, - 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, - 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, - 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, - 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]), - new Uint32Array([ - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, - 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, - 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, - 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, - 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, - 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, - 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, - 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, - 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, - 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, - 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, - 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, - 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, - 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, - 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, - 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, - 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, - 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, - 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, - 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, - 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, - 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, - 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, - 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, - 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, - 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, - 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, - 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, - 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, - 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, - 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, - 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, - 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, - 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, - 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, - 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, - 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, - 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, - 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, - 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, - 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]), - new Uint32Array([ - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, - 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, - 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, - 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, - 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, - 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, - 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, - 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, - 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, - 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, - 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, - 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, - 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, - 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, - 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, - 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, - 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, - 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, - 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, - 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, - 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, - 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, - 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, - 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, - 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, - 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, - 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, - 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, - 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, - 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, - 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, - 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, - 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, - 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, - 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, - 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, - 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, - 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, - 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, - 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, - 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, - 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]) - ]; - this.P = new Uint32Array([ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, - 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, - 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, - 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, - 0x9216d5d9, 0x8979fb1b]); -}; - -function F(S, x8, i) { - return (((S[0][x8[i+3]] + - S[1][x8[i+2]]) ^ - S[2][x8[i+1]]) + - S[3][x8[i]]); -}; - -Blowfish.prototype.encipher = function(x, x8) { - if (x8 === undefined) { - x8 = new Uint8Array(x.buffer); - if (x.byteOffset !== 0) - x8 = x8.subarray(x.byteOffset); - } - x[0] ^= this.P[0]; - for (var i = 1; i < 16; i += 2) { - x[1] ^= F(this.S, x8, 0) ^ this.P[i]; - x[0] ^= F(this.S, x8, 4) ^ this.P[i+1]; - } - var t = x[0]; - x[0] = x[1] ^ this.P[17]; - x[1] = t; -}; - -Blowfish.prototype.decipher = function(x) { - var x8 = new Uint8Array(x.buffer); - if (x.byteOffset !== 0) - x8 = x8.subarray(x.byteOffset); - x[0] ^= this.P[17]; - for (var i = 16; i > 0; i -= 2) { - x[1] ^= F(this.S, x8, 0) ^ this.P[i]; - x[0] ^= F(this.S, x8, 4) ^ this.P[i-1]; - } - var t = x[0]; - x[0] = x[1] ^ this.P[0]; - x[1] = t; -}; - -function stream2word(data, databytes){ - var i, temp = 0; - for (i = 0; i < 4; i++, BLF_J++) { - if (BLF_J >= databytes) BLF_J = 0; - temp = (temp << 8) | data[BLF_J]; - } - return temp; -}; - -Blowfish.prototype.expand0state = function(key, keybytes) { - var d = new Uint32Array(2), i, k; - var d8 = new Uint8Array(d.buffer); - - for (i = 0, BLF_J = 0; i < 18; i++) { - this.P[i] ^= stream2word(key, keybytes); - } - BLF_J = 0; - - for (i = 0; i < 18; i += 2) { - this.encipher(d, d8); - this.P[i] = d[0]; - this.P[i+1] = d[1]; - } - - for (i = 0; i < 4; i++) { - for (k = 0; k < 256; k += 2) { - this.encipher(d, d8); - this.S[i][k] = d[0]; - this.S[i][k+1] = d[1]; - } - } -}; - -Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) { - var d = new Uint32Array(2), i, k; - - for (i = 0, BLF_J = 0; i < 18; i++) { - this.P[i] ^= stream2word(key, keybytes); - } - - for (i = 0, BLF_J = 0; i < 18; i += 2) { - d[0] ^= stream2word(data, databytes); - d[1] ^= stream2word(data, databytes); - this.encipher(d); - this.P[i] = d[0]; - this.P[i+1] = d[1]; - } - - for (i = 0; i < 4; i++) { - for (k = 0; k < 256; k += 2) { - d[0] ^= stream2word(data, databytes); - d[1] ^= stream2word(data, databytes); - this.encipher(d); - this.S[i][k] = d[0]; - this.S[i][k+1] = d[1]; - } - } - BLF_J = 0; -}; - -Blowfish.prototype.enc = function(data, blocks) { - for (var i = 0; i < blocks; i++) { - this.encipher(data.subarray(i*2)); - } -}; - -Blowfish.prototype.dec = function(data, blocks) { - for (var i = 0; i < blocks; i++) { - this.decipher(data.subarray(i*2)); - } -}; - -var BCRYPT_BLOCKS = 8, - BCRYPT_HASHSIZE = 32; - -function bcrypt_hash(sha2pass, sha2salt, out) { - var state = new Blowfish(), - cdata = new Uint32Array(BCRYPT_BLOCKS), i, - ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105, - 99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109, - 105,116,101]); //"OxychromaticBlowfishSwatDynamite" - - state.expandstate(sha2salt, 64, sha2pass, 64); - for (i = 0; i < 64; i++) { - state.expand0state(sha2salt, 64); - state.expand0state(sha2pass, 64); - } - - for (i = 0; i < BCRYPT_BLOCKS; i++) - cdata[i] = stream2word(ciphertext, ciphertext.byteLength); - for (i = 0; i < 64; i++) - state.enc(cdata, cdata.byteLength / 8); - - for (i = 0; i < BCRYPT_BLOCKS; i++) { - out[4*i+3] = cdata[i] >>> 24; - out[4*i+2] = cdata[i] >>> 16; - out[4*i+1] = cdata[i] >>> 8; - out[4*i+0] = cdata[i]; - } -}; - -function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) { - var sha2pass = new Uint8Array(64), - sha2salt = new Uint8Array(64), - out = new Uint8Array(BCRYPT_HASHSIZE), - tmpout = new Uint8Array(BCRYPT_HASHSIZE), - countsalt = new Uint8Array(saltlen+4), - i, j, amt, stride, dest, count, - origkeylen = keylen; - - if (rounds < 1) - return -1; - if (passlen === 0 || saltlen === 0 || keylen === 0 || - keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20)) - return -1; - - stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength); - amt = Math.floor((keylen + stride - 1) / stride); - - for (i = 0; i < saltlen; i++) - countsalt[i] = salt[i]; - - crypto_hash_sha512(sha2pass, pass, passlen); - - for (count = 1; keylen > 0; count++) { - countsalt[saltlen+0] = count >>> 24; - countsalt[saltlen+1] = count >>> 16; - countsalt[saltlen+2] = count >>> 8; - countsalt[saltlen+3] = count; - - crypto_hash_sha512(sha2salt, countsalt, saltlen + 4); - bcrypt_hash(sha2pass, sha2salt, tmpout); - for (i = out.byteLength; i--;) - out[i] = tmpout[i]; - - for (i = 1; i < rounds; i++) { - crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength); - bcrypt_hash(sha2pass, sha2salt, tmpout); - for (j = 0; j < out.byteLength; j++) - out[j] ^= tmpout[j]; - } - - amt = Math.min(amt, keylen); - for (i = 0; i < amt; i++) { - dest = i * stride + (count - 1); - if (dest >= origkeylen) - break; - key[dest] = out[i]; - } - keylen -= i; - } - - return 0; -}; - -module.exports = { - BLOCKS: BCRYPT_BLOCKS, - HASHSIZE: BCRYPT_HASHSIZE, - hash: bcrypt_hash, - pbkdf: bcrypt_pbkdf -}; - -},{"tweetnacl":208}],73:[function(require,module,exports){ - -/** - * slice() reference. - */ - -var slice = Array.prototype.slice; - -/** - * Expose `co`. - */ - -module.exports = co['default'] = co.co = co; - -/** - * Wrap the given generator `fn` into a - * function that returns a promise. - * This is a separate function so that - * every `co()` call doesn't create a new, - * unnecessary closure. - * - * @param {GeneratorFunction} fn - * @return {Function} - * @api public - */ - -co.wrap = function (fn) { - createPromise.__generatorFunction__ = fn; - return createPromise; - function createPromise() { - return co.call(this, fn.apply(this, arguments)); - } -}; - -/** - * Execute the generator function or a generator - * and return a promise. - * - * @param {Function} fn - * @return {Promise} - * @api public - */ - -function co(gen) { - var ctx = this; - var args = slice.call(arguments, 1) - - // we wrap everything in a promise to avoid promise chaining, - // which leads to memory leak errors. - // see https://github.com/tj/co/issues/180 - return new Promise(function(resolve, reject) { - if (typeof gen === 'function') gen = gen.apply(ctx, args); - if (!gen || typeof gen.next !== 'function') return resolve(gen); - - onFulfilled(); - - /** - * @param {Mixed} res - * @return {Promise} - * @api private - */ - - function onFulfilled(res) { - var ret; - try { - ret = gen.next(res); - } catch (e) { - return reject(e); - } - next(ret); - } - - /** - * @param {Error} err - * @return {Promise} - * @api private - */ - - function onRejected(err) { - var ret; - try { - ret = gen.throw(err); - } catch (e) { - return reject(e); - } - next(ret); - } - - /** - * Get the next value in the generator, - * return a promise. - * - * @param {Object} ret - * @return {Promise} - * @api private - */ - - function next(ret) { - if (ret.done) return resolve(ret.value); - var value = toPromise.call(ctx, ret.value); - if (value && isPromise(value)) return value.then(onFulfilled, onRejected); - return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, ' - + 'but the following object was passed: "' + String(ret.value) + '"')); - } - }); -} - -/** - * Convert a `yield`ed value into a promise. - * - * @param {Mixed} obj - * @return {Promise} - * @api private - */ - -function toPromise(obj) { - if (!obj) return obj; - if (isPromise(obj)) return obj; - if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj); - if ('function' == typeof obj) return thunkToPromise.call(this, obj); - if (Array.isArray(obj)) return arrayToPromise.call(this, obj); - if (isObject(obj)) return objectToPromise.call(this, obj); - return obj; -} - -/** - * Convert a thunk to a promise. - * - * @param {Function} - * @return {Promise} - * @api private - */ - -function thunkToPromise(fn) { - var ctx = this; - return new Promise(function (resolve, reject) { - fn.call(ctx, function (err, res) { - if (err) return reject(err); - if (arguments.length > 2) res = slice.call(arguments, 1); - resolve(res); - }); - }); -} - -/** - * Convert an array of "yieldables" to a promise. - * Uses `Promise.all()` internally. - * - * @param {Array} obj - * @return {Promise} - * @api private - */ - -function arrayToPromise(obj) { - return Promise.all(obj.map(toPromise, this)); -} - -/** - * Convert an object of "yieldables" to a promise. - * Uses `Promise.all()` internally. - * - * @param {Object} obj - * @return {Promise} - * @api private - */ - -function objectToPromise(obj){ - var results = new obj.constructor(); - var keys = Object.keys(obj); - var promises = []; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var promise = toPromise.call(this, obj[key]); - if (promise && isPromise(promise)) defer(promise, key); - else results[key] = obj[key]; - } - return Promise.all(promises).then(function () { - return results; - }); - - function defer(promise, key) { - // predefine the key in the result - results[key] = undefined; - promises.push(promise.then(function (res) { - results[key] = res; - })); - } -} - -/** - * Check if `obj` is a promise. - * - * @param {Object} obj - * @return {Boolean} - * @api private - */ - -function isPromise(obj) { - return 'function' == typeof obj.then; -} - -/** - * Check if `obj` is a generator. - * - * @param {Mixed} obj - * @return {Boolean} - * @api private - */ - -function isGenerator(obj) { - return 'function' == typeof obj.next && 'function' == typeof obj.throw; -} - -/** - * Check if `obj` is a generator function. - * - * @param {Mixed} obj - * @return {Boolean} - * @api private - */ -function isGeneratorFunction(obj) { - var constructor = obj.constructor; - if (!constructor) return false; - if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true; - return isGenerator(constructor.prototype); -} - -/** - * Check for plain object. - * - * @param {Mixed} val - * @return {Boolean} - * @api private - */ - -function isObject(val) { - return Object == val.constructor; -} - -},{}],74:[function(require,module,exports){ -var util = require('util'); -var Stream = require('stream').Stream; -var DelayedStream = require('delayed-stream'); -var defer = require('./defer.js'); - -module.exports = CombinedStream; -function CombinedStream() { - this.writable = false; - this.readable = true; - this.dataSize = 0; - this.maxDataSize = 2 * 1024 * 1024; - this.pauseStreams = true; - - this._released = false; - this._streams = []; - this._currentStream = null; -} -util.inherits(CombinedStream, Stream); - -CombinedStream.create = function(options) { - var combinedStream = new this(); - - options = options || {}; - for (var option in options) { - combinedStream[option] = options[option]; - } - - return combinedStream; -}; - -CombinedStream.isStreamLike = function(stream) { - return (typeof stream !== 'function') - && (typeof stream !== 'string') - && (typeof stream !== 'boolean') - && (typeof stream !== 'number') - && (!Buffer.isBuffer(stream)); -}; - -CombinedStream.prototype.append = function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - - if (isStreamLike) { - if (!(stream instanceof DelayedStream)) { - var newStream = DelayedStream.create(stream, { - maxDataSize: Infinity, - pauseStream: this.pauseStreams, - }); - stream.on('data', this._checkDataSize.bind(this)); - stream = newStream; - } - - this._handleErrors(stream); - - if (this.pauseStreams) { - stream.pause(); - } - } - - this._streams.push(stream); - return this; -}; - -CombinedStream.prototype.pipe = function(dest, options) { - Stream.prototype.pipe.call(this, dest, options); - this.resume(); - return dest; -}; - -CombinedStream.prototype._getNext = function() { - this._currentStream = null; - var stream = this._streams.shift(); - - - if (typeof stream == 'undefined') { - this.end(); - return; - } - - if (typeof stream !== 'function') { - this._pipeNext(stream); - return; - } - - var getStream = stream; - getStream(function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('data', this._checkDataSize.bind(this)); - this._handleErrors(stream); - } - - defer(this._pipeNext.bind(this, stream)); - }.bind(this)); -}; - -CombinedStream.prototype._pipeNext = function(stream) { - this._currentStream = stream; - - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('end', this._getNext.bind(this)); - stream.pipe(this, {end: false}); - return; - } - - var value = stream; - this.write(value); - this._getNext(); -}; - -CombinedStream.prototype._handleErrors = function(stream) { - var self = this; - stream.on('error', function(err) { - self._emitError(err); - }); -}; - -CombinedStream.prototype.write = function(data) { - this.emit('data', data); -}; - -CombinedStream.prototype.pause = function() { - if (!this.pauseStreams) { - return; - } - - if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause(); - this.emit('pause'); -}; - -CombinedStream.prototype.resume = function() { - if (!this._released) { - this._released = true; - this.writable = true; - this._getNext(); - } - - if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume(); - this.emit('resume'); -}; - -CombinedStream.prototype.end = function() { - this._reset(); - this.emit('end'); -}; - -CombinedStream.prototype.destroy = function() { - this._reset(); - this.emit('close'); -}; - -CombinedStream.prototype._reset = function() { - this.writable = false; - this._streams = []; - this._currentStream = null; -}; - -CombinedStream.prototype._checkDataSize = function() { - this._updateDataSize(); - if (this.dataSize <= this.maxDataSize) { - return; - } - - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'; - this._emitError(new Error(message)); -}; - -CombinedStream.prototype._updateDataSize = function() { - this.dataSize = 0; - - var self = this; - this._streams.forEach(function(stream) { - if (!stream.dataSize) { - return; - } - - self.dataSize += stream.dataSize; - }); - - if (this._currentStream && this._currentStream.dataSize) { - this.dataSize += this._currentStream.dataSize; - } -}; - -CombinedStream.prototype._emitError = function(err) { - this._reset(); - this.emit('error', err); -}; - -},{"./defer.js":75,"delayed-stream":77,"stream":undefined,"util":undefined}],75:[function(require,module,exports){ -arguments[4][63][0].apply(exports,arguments) -},{"dup":63}],76:[function(require,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -},{}],77:[function(require,module,exports){ -var Stream = require('stream').Stream; -var util = require('util'); - -module.exports = DelayedStream; -function DelayedStream() { - this.source = null; - this.dataSize = 0; - this.maxDataSize = 1024 * 1024; - this.pauseStream = true; - - this._maxDataSizeExceeded = false; - this._released = false; - this._bufferedEvents = []; -} -util.inherits(DelayedStream, Stream); - -DelayedStream.create = function(source, options) { - var delayedStream = new this(); - - options = options || {}; - for (var option in options) { - delayedStream[option] = options[option]; - } - - delayedStream.source = source; - - var realEmit = source.emit; - source.emit = function() { - delayedStream._handleEmit(arguments); - return realEmit.apply(source, arguments); - }; - - source.on('error', function() {}); - if (delayedStream.pauseStream) { - source.pause(); - } - - return delayedStream; -}; - -Object.defineProperty(DelayedStream.prototype, 'readable', { - configurable: true, - enumerable: true, - get: function() { - return this.source.readable; - } -}); - -DelayedStream.prototype.setEncoding = function() { - return this.source.setEncoding.apply(this.source, arguments); -}; - -DelayedStream.prototype.resume = function() { - if (!this._released) { - this.release(); - } - - this.source.resume(); -}; - -DelayedStream.prototype.pause = function() { - this.source.pause(); -}; - -DelayedStream.prototype.release = function() { - this._released = true; - - this._bufferedEvents.forEach(function(args) { - this.emit.apply(this, args); - }.bind(this)); - this._bufferedEvents = []; -}; - -DelayedStream.prototype.pipe = function() { - var r = Stream.prototype.pipe.apply(this, arguments); - this.resume(); - return r; -}; - -DelayedStream.prototype._handleEmit = function(args) { - if (this._released) { - this.emit.apply(this, args); - return; - } - - if (args[0] === 'data') { - this.dataSize += args[1].length; - this._checkIfMaxDataSizeExceeded(); - } - - this._bufferedEvents.push(args); -}; - -DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { - if (this._maxDataSizeExceeded) { - return; - } - - if (this.dataSize <= this.maxDataSize) { - return; - } - - this._maxDataSizeExceeded = true; - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this.emit('error', new Error(message)); -}; - -},{"stream":undefined,"util":undefined}],78:[function(require,module,exports){ -var crypto = require("crypto"); -var BigInteger = require("jsbn").BigInteger; -var ECPointFp = require("./lib/ec.js").ECPointFp; -exports.ECCurves = require("./lib/sec.js"); - -// zero prepad -function unstupid(hex,len) -{ - return (hex.length >= len) ? hex : unstupid("0"+hex,len); -} - -exports.ECKey = function(curve, key, isPublic) -{ - var priv; - var c = curve(); - var n = c.getN(); - var bytes = Math.floor(n.bitLength()/8); - - if(key) - { - if(isPublic) - { - var curve = c.getCurve(); -// var x = key.slice(1,bytes+1); // skip the 04 for uncompressed format -// var y = key.slice(bytes+1); -// this.P = new ECPointFp(curve, -// curve.fromBigInteger(new BigInteger(x.toString("hex"), 16)), -// curve.fromBigInteger(new BigInteger(y.toString("hex"), 16))); - this.P = curve.decodePointHex(key.toString("hex")); - }else{ - if(key.length != bytes) return false; - priv = new BigInteger(key.toString("hex"), 16); - } - }else{ - var n1 = n.subtract(BigInteger.ONE); - var r = new BigInteger(crypto.randomBytes(n.bitLength())); - priv = r.mod(n1).add(BigInteger.ONE); - this.P = c.getG().multiply(priv); - } - if(this.P) - { -// var pubhex = unstupid(this.P.getX().toBigInteger().toString(16),bytes*2)+unstupid(this.P.getY().toBigInteger().toString(16),bytes*2); -// this.PublicKey = new Buffer("04"+pubhex,"hex"); - this.PublicKey = new Buffer(c.getCurve().encodeCompressedPointHex(this.P),"hex"); - } - if(priv) - { - this.PrivateKey = new Buffer(unstupid(priv.toString(16),bytes*2),"hex"); - this.deriveSharedSecret = function(key) - { - if(!key || !key.P) return false; - var S = key.P.multiply(priv); - return new Buffer(unstupid(S.getX().toBigInteger().toString(16),bytes*2),"hex"); - } - } -} - - -},{"./lib/ec.js":79,"./lib/sec.js":80,"crypto":undefined,"jsbn":113}],79:[function(require,module,exports){ -// Basic Javascript Elliptic Curve implementation -// Ported loosely from BouncyCastle's Java EC code -// Only Fp curves implemented for now - -// Requires jsbn.js and jsbn2.js -var BigInteger = require('jsbn').BigInteger -var Barrett = BigInteger.prototype.Barrett - -// ---------------- -// ECFieldElementFp - -// constructor -function ECFieldElementFp(q,x) { - this.x = x; - // TODO if(x.compareTo(q) >= 0) error - this.q = q; -} - -function feFpEquals(other) { - if(other == this) return true; - return (this.q.equals(other.q) && this.x.equals(other.x)); -} - -function feFpToBigInteger() { - return this.x; -} - -function feFpNegate() { - return new ECFieldElementFp(this.q, this.x.negate().mod(this.q)); -} - -function feFpAdd(b) { - return new ECFieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q)); -} - -function feFpSubtract(b) { - return new ECFieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q)); -} - -function feFpMultiply(b) { - return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q)); -} - -function feFpSquare() { - return new ECFieldElementFp(this.q, this.x.square().mod(this.q)); -} - -function feFpDivide(b) { - return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q)); -} - -ECFieldElementFp.prototype.equals = feFpEquals; -ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger; -ECFieldElementFp.prototype.negate = feFpNegate; -ECFieldElementFp.prototype.add = feFpAdd; -ECFieldElementFp.prototype.subtract = feFpSubtract; -ECFieldElementFp.prototype.multiply = feFpMultiply; -ECFieldElementFp.prototype.square = feFpSquare; -ECFieldElementFp.prototype.divide = feFpDivide; - -// ---------------- -// ECPointFp - -// constructor -function ECPointFp(curve,x,y,z) { - this.curve = curve; - this.x = x; - this.y = y; - // Projective coordinates: either zinv == null or z * zinv == 1 - // z and zinv are just BigIntegers, not fieldElements - if(z == null) { - this.z = BigInteger.ONE; - } - else { - this.z = z; - } - this.zinv = null; - //TODO: compression flag -} - -function pointFpGetX() { - if(this.zinv == null) { - this.zinv = this.z.modInverse(this.curve.q); - } - var r = this.x.toBigInteger().multiply(this.zinv); - this.curve.reduce(r); - return this.curve.fromBigInteger(r); -} - -function pointFpGetY() { - if(this.zinv == null) { - this.zinv = this.z.modInverse(this.curve.q); - } - var r = this.y.toBigInteger().multiply(this.zinv); - this.curve.reduce(r); - return this.curve.fromBigInteger(r); -} - -function pointFpEquals(other) { - if(other == this) return true; - if(this.isInfinity()) return other.isInfinity(); - if(other.isInfinity()) return this.isInfinity(); - var u, v; - // u = Y2 * Z1 - Y1 * Z2 - u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q); - if(!u.equals(BigInteger.ZERO)) return false; - // v = X2 * Z1 - X1 * Z2 - v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q); - return v.equals(BigInteger.ZERO); -} - -function pointFpIsInfinity() { - if((this.x == null) && (this.y == null)) return true; - return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO); -} - -function pointFpNegate() { - return new ECPointFp(this.curve, this.x, this.y.negate(), this.z); -} - -function pointFpAdd(b) { - if(this.isInfinity()) return b; - if(b.isInfinity()) return this; - - // u = Y2 * Z1 - Y1 * Z2 - var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q); - // v = X2 * Z1 - X1 * Z2 - var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q); - - if(BigInteger.ZERO.equals(v)) { - if(BigInteger.ZERO.equals(u)) { - return this.twice(); // this == b, so double - } - return this.curve.getInfinity(); // this = -b, so infinity - } - - var THREE = new BigInteger("3"); - var x1 = this.x.toBigInteger(); - var y1 = this.y.toBigInteger(); - var x2 = b.x.toBigInteger(); - var y2 = b.y.toBigInteger(); - - var v2 = v.square(); - var v3 = v2.multiply(v); - var x1v2 = x1.multiply(v2); - var zu2 = u.square().multiply(this.z); - - // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3) - var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q); - // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3 - var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q); - // z3 = v^3 * z1 * z2 - var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q); - - return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); -} - -function pointFpTwice() { - if(this.isInfinity()) return this; - if(this.y.toBigInteger().signum() == 0) return this.curve.getInfinity(); - - // TODO: optimized handling of constants - var THREE = new BigInteger("3"); - var x1 = this.x.toBigInteger(); - var y1 = this.y.toBigInteger(); - - var y1z1 = y1.multiply(this.z); - var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q); - var a = this.curve.a.toBigInteger(); - - // w = 3 * x1^2 + a * z1^2 - var w = x1.square().multiply(THREE); - if(!BigInteger.ZERO.equals(a)) { - w = w.add(this.z.square().multiply(a)); - } - w = w.mod(this.curve.q); - //this.curve.reduce(w); - // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1) - var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q); - // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3 - var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q); - // z3 = 8 * (y1 * z1)^3 - var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q); - - return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3); -} - -// Simple NAF (Non-Adjacent Form) multiplication algorithm -// TODO: modularize the multiplication algorithm -function pointFpMultiply(k) { - if(this.isInfinity()) return this; - if(k.signum() == 0) return this.curve.getInfinity(); - - var e = k; - var h = e.multiply(new BigInteger("3")); - - var neg = this.negate(); - var R = this; - - var i; - for(i = h.bitLength() - 2; i > 0; --i) { - R = R.twice(); - - var hBit = h.testBit(i); - var eBit = e.testBit(i); - - if (hBit != eBit) { - R = R.add(hBit ? this : neg); - } - } - - return R; -} - -// Compute this*j + x*k (simultaneous multiplication) -function pointFpMultiplyTwo(j,x,k) { - var i; - if(j.bitLength() > k.bitLength()) - i = j.bitLength() - 1; - else - i = k.bitLength() - 1; - - var R = this.curve.getInfinity(); - var both = this.add(x); - while(i >= 0) { - R = R.twice(); - if(j.testBit(i)) { - if(k.testBit(i)) { - R = R.add(both); - } - else { - R = R.add(this); - } - } - else { - if(k.testBit(i)) { - R = R.add(x); - } - } - --i; - } - - return R; -} - -ECPointFp.prototype.getX = pointFpGetX; -ECPointFp.prototype.getY = pointFpGetY; -ECPointFp.prototype.equals = pointFpEquals; -ECPointFp.prototype.isInfinity = pointFpIsInfinity; -ECPointFp.prototype.negate = pointFpNegate; -ECPointFp.prototype.add = pointFpAdd; -ECPointFp.prototype.twice = pointFpTwice; -ECPointFp.prototype.multiply = pointFpMultiply; -ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo; - -// ---------------- -// ECCurveFp - -// constructor -function ECCurveFp(q,a,b) { - this.q = q; - this.a = this.fromBigInteger(a); - this.b = this.fromBigInteger(b); - this.infinity = new ECPointFp(this, null, null); - this.reducer = new Barrett(this.q); -} - -function curveFpGetQ() { - return this.q; -} - -function curveFpGetA() { - return this.a; -} - -function curveFpGetB() { - return this.b; -} - -function curveFpEquals(other) { - if(other == this) return true; - return(this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b)); -} - -function curveFpGetInfinity() { - return this.infinity; -} - -function curveFpFromBigInteger(x) { - return new ECFieldElementFp(this.q, x); -} - -function curveReduce(x) { - this.reducer.reduce(x); -} - -// for now, work with hex strings because they're easier in JS -function curveFpDecodePointHex(s) { - switch(parseInt(s.substr(0,2), 16)) { // first byte - case 0: - return this.infinity; - case 2: - case 3: - // point compression not supported yet - return null; - case 4: - case 6: - case 7: - var len = (s.length - 2) / 2; - var xHex = s.substr(2, len); - var yHex = s.substr(len+2, len); - - return new ECPointFp(this, - this.fromBigInteger(new BigInteger(xHex, 16)), - this.fromBigInteger(new BigInteger(yHex, 16))); - - default: // unsupported - return null; - } -} - -function curveFpEncodePointHex(p) { - if (p.isInfinity()) return "00"; - var xHex = p.getX().toBigInteger().toString(16); - var yHex = p.getY().toBigInteger().toString(16); - var oLen = this.getQ().toString(16).length; - if ((oLen % 2) != 0) oLen++; - while (xHex.length < oLen) { - xHex = "0" + xHex; - } - while (yHex.length < oLen) { - yHex = "0" + yHex; - } - return "04" + xHex + yHex; -} - -ECCurveFp.prototype.getQ = curveFpGetQ; -ECCurveFp.prototype.getA = curveFpGetA; -ECCurveFp.prototype.getB = curveFpGetB; -ECCurveFp.prototype.equals = curveFpEquals; -ECCurveFp.prototype.getInfinity = curveFpGetInfinity; -ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger; -ECCurveFp.prototype.reduce = curveReduce; -//ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex; -ECCurveFp.prototype.encodePointHex = curveFpEncodePointHex; - -// from: https://github.com/kaielvin/jsbn-ec-point-compression -ECCurveFp.prototype.decodePointHex = function(s) -{ - var yIsEven; - switch(parseInt(s.substr(0,2), 16)) { // first byte - case 0: - return this.infinity; - case 2: - yIsEven = false; - case 3: - if(yIsEven == undefined) yIsEven = true; - var len = s.length - 2; - var xHex = s.substr(2, len); - var x = this.fromBigInteger(new BigInteger(xHex,16)); - var alpha = x.multiply(x.square().add(this.getA())).add(this.getB()); - var beta = alpha.sqrt(); - - if (beta == null) throw "Invalid point compression"; - - var betaValue = beta.toBigInteger(); - if (betaValue.testBit(0) != yIsEven) - { - // Use the other root - beta = this.fromBigInteger(this.getQ().subtract(betaValue)); - } - return new ECPointFp(this,x,beta); - case 4: - case 6: - case 7: - var len = (s.length - 2) / 2; - var xHex = s.substr(2, len); - var yHex = s.substr(len+2, len); - - return new ECPointFp(this, - this.fromBigInteger(new BigInteger(xHex, 16)), - this.fromBigInteger(new BigInteger(yHex, 16))); - - default: // unsupported - return null; - } -} -ECCurveFp.prototype.encodeCompressedPointHex = function(p) -{ - if (p.isInfinity()) return "00"; - var xHex = p.getX().toBigInteger().toString(16); - var oLen = this.getQ().toString(16).length; - if ((oLen % 2) != 0) oLen++; - while (xHex.length < oLen) - xHex = "0" + xHex; - var yPrefix; - if(p.getY().toBigInteger().isEven()) yPrefix = "02"; - else yPrefix = "03"; - - return yPrefix + xHex; -} - - -ECFieldElementFp.prototype.getR = function() -{ - if(this.r != undefined) return this.r; - - this.r = null; - var bitLength = this.q.bitLength(); - if (bitLength > 128) - { - var firstWord = this.q.shiftRight(bitLength - 64); - if (firstWord.intValue() == -1) - { - this.r = BigInteger.ONE.shiftLeft(bitLength).subtract(this.q); - } - } - return this.r; -} -ECFieldElementFp.prototype.modMult = function(x1,x2) -{ - return this.modReduce(x1.multiply(x2)); -} -ECFieldElementFp.prototype.modReduce = function(x) -{ - if (this.getR() != null) - { - var qLen = q.bitLength(); - while (x.bitLength() > (qLen + 1)) - { - var u = x.shiftRight(qLen); - var v = x.subtract(u.shiftLeft(qLen)); - if (!this.getR().equals(BigInteger.ONE)) - { - u = u.multiply(this.getR()); - } - x = u.add(v); - } - while (x.compareTo(q) >= 0) - { - x = x.subtract(q); - } - } - else - { - x = x.mod(q); - } - return x; -} -ECFieldElementFp.prototype.sqrt = function() -{ - if (!this.q.testBit(0)) throw "unsupported"; - - // p mod 4 == 3 - if (this.q.testBit(1)) - { - var z = new ECFieldElementFp(this.q,this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE),this.q)); - return z.square().equals(this) ? z : null; - } - - // p mod 4 == 1 - var qMinusOne = this.q.subtract(BigInteger.ONE); - - var legendreExponent = qMinusOne.shiftRight(1); - if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE))) - { - return null; - } - - var u = qMinusOne.shiftRight(2); - var k = u.shiftLeft(1).add(BigInteger.ONE); - - var Q = this.x; - var fourQ = modDouble(modDouble(Q)); - - var U, V; - do - { - var P; - do - { - P = new BigInteger(this.q.bitLength(), new SecureRandom()); - } - while (P.compareTo(this.q) >= 0 - || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne))); - - var result = this.lucasSequence(P, Q, k); - U = result[0]; - V = result[1]; - - if (this.modMult(V, V).equals(fourQ)) - { - // Integer division by 2, mod q - if (V.testBit(0)) - { - V = V.add(q); - } - - V = V.shiftRight(1); - - return new ECFieldElementFp(q,V); - } - } - while (U.equals(BigInteger.ONE) || U.equals(qMinusOne)); - - return null; -} -ECFieldElementFp.prototype.lucasSequence = function(P,Q,k) -{ - var n = k.bitLength(); - var s = k.getLowestSetBit(); - - var Uh = BigInteger.ONE; - var Vl = BigInteger.TWO; - var Vh = P; - var Ql = BigInteger.ONE; - var Qh = BigInteger.ONE; - - for (var j = n - 1; j >= s + 1; --j) - { - Ql = this.modMult(Ql, Qh); - - if (k.testBit(j)) - { - Qh = this.modMult(Ql, Q); - Uh = this.modMult(Uh, Vh); - Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql))); - Vh = this.modReduce(Vh.multiply(Vh).subtract(Qh.shiftLeft(1))); - } - else - { - Qh = Ql; - Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql)); - Vh = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql))); - Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1))); - } - } - - Ql = this.modMult(Ql, Qh); - Qh = this.modMult(Ql, Q); - Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql)); - Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql))); - Ql = this.modMult(Ql, Qh); - - for (var j = 1; j <= s; ++j) - { - Uh = this.modMult(Uh, Vl); - Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1))); - Ql = this.modMult(Ql, Ql); - } - - return [ Uh, Vl ]; -} - -var exports = { - ECCurveFp: ECCurveFp, - ECPointFp: ECPointFp, - ECFieldElementFp: ECFieldElementFp -} - -module.exports = exports - -},{"jsbn":113}],80:[function(require,module,exports){ -// Named EC curves - -// Requires ec.js, jsbn.js, and jsbn2.js -var BigInteger = require('jsbn').BigInteger -var ECCurveFp = require('./ec.js').ECCurveFp - - -// ---------------- -// X9ECParameters - -// constructor -function X9ECParameters(curve,g,n,h) { - this.curve = curve; - this.g = g; - this.n = n; - this.h = h; -} - -function x9getCurve() { - return this.curve; -} - -function x9getG() { - return this.g; -} - -function x9getN() { - return this.n; -} - -function x9getH() { - return this.h; -} - -X9ECParameters.prototype.getCurve = x9getCurve; -X9ECParameters.prototype.getG = x9getG; -X9ECParameters.prototype.getN = x9getN; -X9ECParameters.prototype.getH = x9getH; - -// ---------------- -// SECNamedCurves - -function fromHex(s) { return new BigInteger(s, 16); } - -function secp128r1() { - // p = 2^128 - 2^97 - 1 - var p = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"); - var a = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC"); - var b = fromHex("E87579C11079F43DD824993C2CEE5ED3"); - //byte[] S = Hex.decode("000E0D4D696E6768756151750CC03A4473D03679"); - var n = fromHex("FFFFFFFE0000000075A30D1B9038A115"); - var h = BigInteger.ONE; - var curve = new ECCurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "161FF7528B899B2D0C28607CA52C5B86" - + "CF5AC8395BAFEB13C02DA292DDED7A83"); - return new X9ECParameters(curve, G, n, h); -} - -function secp160k1() { - // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1 - var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"); - var a = BigInteger.ZERO; - var b = fromHex("7"); - //byte[] S = null; - var n = fromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3"); - var h = BigInteger.ONE; - var curve = new ECCurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB" - + "938CF935318FDCED6BC28286531733C3F03C4FEE"); - return new X9ECParameters(curve, G, n, h); -} - -function secp160r1() { - // p = 2^160 - 2^31 - 1 - var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"); - var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"); - var b = fromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45"); - //byte[] S = Hex.decode("1053CDE42C14D696E67687561517533BF3F83345"); - var n = fromHex("0100000000000000000001F4C8F927AED3CA752257"); - var h = BigInteger.ONE; - var curve = new ECCurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "4A96B5688EF573284664698968C38BB913CBFC82" - + "23A628553168947D59DCC912042351377AC5FB32"); - return new X9ECParameters(curve, G, n, h); -} - -function secp192k1() { - // p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1 - var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37"); - var a = BigInteger.ZERO; - var b = fromHex("3"); - //byte[] S = null; - var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D"); - var h = BigInteger.ONE; - var curve = new ECCurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D" - + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D"); - return new X9ECParameters(curve, G, n, h); -} - -function secp192r1() { - // p = 2^192 - 2^64 - 1 - var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"); - var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"); - var b = fromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1"); - //byte[] S = Hex.decode("3045AE6FC8422F64ED579528D38120EAE12196D5"); - var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831"); - var h = BigInteger.ONE; - var curve = new ECCurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" - + "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811"); - return new X9ECParameters(curve, G, n, h); -} - -function secp224r1() { - // p = 2^224 - 2^96 + 1 - var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001"); - var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"); - var b = fromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4"); - //byte[] S = Hex.decode("BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5"); - var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D"); - var h = BigInteger.ONE; - var curve = new ECCurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" - + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34"); - return new X9ECParameters(curve, G, n, h); -} - -function secp256r1() { - // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1 - var p = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"); - var a = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"); - var b = fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"); - //byte[] S = Hex.decode("C49D360886E704936A6678E1139D26B7819F7E90"); - var n = fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"); - var h = BigInteger.ONE; - var curve = new ECCurveFp(p, a, b); - var G = curve.decodePointHex("04" - + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" - + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"); - return new X9ECParameters(curve, G, n, h); -} - -// TODO: make this into a proper hashtable -function getSECCurveByName(name) { - if(name == "secp128r1") return secp128r1(); - if(name == "secp160k1") return secp160k1(); - if(name == "secp160r1") return secp160r1(); - if(name == "secp192k1") return secp192k1(); - if(name == "secp192r1") return secp192r1(); - if(name == "secp224r1") return secp224r1(); - if(name == "secp256r1") return secp256r1(); - return null; -} - -module.exports = { - "secp128r1":secp128r1, - "secp160k1":secp160k1, - "secp160r1":secp160r1, - "secp192k1":secp192k1, - "secp192r1":secp192r1, - "secp224r1":secp224r1, - "secp256r1":secp256r1 -} - -},{"./ec.js":79,"jsbn":113}],81:[function(require,module,exports){ -'use strict'; - -var hasOwn = Object.prototype.hasOwnProperty; -var toStr = Object.prototype.toString; - -var isArray = function isArray(arr) { - if (typeof Array.isArray === 'function') { - return Array.isArray(arr); - } - - return toStr.call(arr) === '[object Array]'; -}; - -var isPlainObject = function isPlainObject(obj) { - if (!obj || toStr.call(obj) !== '[object Object]') { - return false; - } - - var hasOwnConstructor = hasOwn.call(obj, 'constructor'); - var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); - // Not own constructor property must be Object - if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - var key; - for (key in obj) { /**/ } - - return typeof key === 'undefined' || hasOwn.call(obj, key); -}; - -module.exports = function extend() { - var options, name, src, copy, copyIsArray, clone; - var target = arguments[0]; - var i = 1; - var length = arguments.length; - var deep = false; - - // Handle a deep copy situation - if (typeof target === 'boolean') { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { - target = {}; - } - - for (; i < length; ++i) { - options = arguments[i]; - // Only deal with non-null/undefined values - if (options != null) { - // Extend the base object - for (name in options) { - src = target[name]; - copy = options[name]; - - // Prevent never-ending loop - if (target !== copy) { - // Recurse if we're merging plain objects or arrays - if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && isArray(src) ? src : []; - } else { - clone = src && isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[name] = extend(deep, clone, copy); - - // Don't bring in undefined values - } else if (typeof copy !== 'undefined') { - target[name] = copy; - } - } - } - } - } - - // Return the modified object - return target; -}; - -},{}],82:[function(require,module,exports){ -/* - * extsprintf.js: extended POSIX-style sprintf - */ - -var mod_assert = require('assert'); -var mod_util = require('util'); - -/* - * Public interface - */ -exports.sprintf = jsSprintf; -exports.printf = jsPrintf; -exports.fprintf = jsFprintf; - -/* - * Stripped down version of s[n]printf(3c). We make a best effort to throw an - * exception when given a format string we don't understand, rather than - * ignoring it, so that we won't break existing programs if/when we go implement - * the rest of this. - * - * This implementation currently supports specifying - * - field alignment ('-' flag), - * - zero-pad ('0' flag) - * - always show numeric sign ('+' flag), - * - field width - * - conversions for strings, decimal integers, and floats (numbers). - * - argument size specifiers. These are all accepted but ignored, since - * Javascript has no notion of the physical size of an argument. - * - * Everything else is currently unsupported, most notably precision, unsigned - * numbers, non-decimal numbers, and characters. - */ -function jsSprintf(fmt) -{ - var regex = [ - '([^%]*)', /* normal text */ - '%', /* start of format */ - '([\'\\-+ #0]*?)', /* flags (optional) */ - '([1-9]\\d*)?', /* width (optional) */ - '(\\.([1-9]\\d*))?', /* precision (optional) */ - '[lhjztL]*?', /* length mods (ignored) */ - '([diouxXfFeEgGaAcCsSp%jr])' /* conversion */ - ].join(''); - - var re = new RegExp(regex); - var args = Array.prototype.slice.call(arguments, 1); - var flags, width, precision, conversion; - var left, pad, sign, arg, match; - var ret = ''; - var argn = 1; - - mod_assert.equal('string', typeof (fmt)); - - while ((match = re.exec(fmt)) !== null) { - ret += match[1]; - fmt = fmt.substring(match[0].length); - - flags = match[2] || ''; - width = match[3] || 0; - precision = match[4] || ''; - conversion = match[6]; - left = false; - sign = false; - pad = ' '; - - if (conversion == '%') { - ret += '%'; - continue; - } - - if (args.length === 0) - throw (new Error('too few args to sprintf')); - - arg = args.shift(); - argn++; - - if (flags.match(/[\' #]/)) - throw (new Error( - 'unsupported flags: ' + flags)); - - if (precision.length > 0) - throw (new Error( - 'non-zero precision not supported')); - - if (flags.match(/-/)) - left = true; - - if (flags.match(/0/)) - pad = '0'; - - if (flags.match(/\+/)) - sign = true; - - switch (conversion) { - case 's': - if (arg === undefined || arg === null) - throw (new Error('argument ' + argn + - ': attempted to print undefined or null ' + - 'as a string')); - ret += doPad(pad, width, left, arg.toString()); - break; - - case 'd': - arg = Math.floor(arg); - /*jsl:fallthru*/ - case 'f': - sign = sign && arg > 0 ? '+' : ''; - ret += sign + doPad(pad, width, left, - arg.toString()); - break; - - case 'x': - ret += doPad(pad, width, left, arg.toString(16)); - break; - - case 'j': /* non-standard */ - if (width === 0) - width = 10; - ret += mod_util.inspect(arg, false, width); - break; - - case 'r': /* non-standard */ - ret += dumpException(arg); - break; - - default: - throw (new Error('unsupported conversion: ' + - conversion)); - } - } - - ret += fmt; - return (ret); -} - -function jsPrintf() { - var args = Array.prototype.slice.call(arguments); - args.unshift(process.stdout); - jsFprintf.apply(null, args); -} - -function jsFprintf(stream) { - var args = Array.prototype.slice.call(arguments, 1); - return (stream.write(jsSprintf.apply(this, args))); -} - -function doPad(chr, width, left, str) -{ - var ret = str; - - while (ret.length < width) { - if (left) - ret += chr; - else - ret = chr + ret; - } - - return (ret); -} - -/* - * This function dumps long stack traces for exceptions having a cause() method. - * See node-verror for an example. - */ -function dumpException(ex) -{ - var ret; - - if (!(ex instanceof Error)) - throw (new Error(jsSprintf('invalid type for %%r: %j', ex))); - - /* Note that V8 prepends "ex.stack" with ex.toString(). */ - ret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack; - - if (ex.cause && typeof (ex.cause) === 'function') { - var cex = ex.cause(); - if (cex) { - ret += '\nCaused by: ' + dumpException(cex); - } - } - - return (ret); -} - -},{"assert":undefined,"util":undefined}],83:[function(require,module,exports){ -'use strict'; - -var isArray = Array.isArray; -var keyList = Object.keys; -var hasProp = Object.prototype.hasOwnProperty; - -module.exports = function equal(a, b) { - if (a === b) return true; - - var arrA = isArray(a) - , arrB = isArray(b) - , i - , length - , key; - - if (arrA && arrB) { - length = a.length; - if (length != b.length) return false; - for (i = 0; i < length; i++) - if (!equal(a[i], b[i])) return false; - return true; - } - - if (arrA != arrB) return false; - - var dateA = a instanceof Date - , dateB = b instanceof Date; - if (dateA != dateB) return false; - if (dateA && dateB) return a.getTime() == b.getTime(); - - var regexpA = a instanceof RegExp - , regexpB = b instanceof RegExp; - if (regexpA != regexpB) return false; - if (regexpA && regexpB) return a.toString() == b.toString(); - - if (a instanceof Object && b instanceof Object) { - var keys = keyList(a); - length = keys.length; - - if (length !== keyList(b).length) - return false; - - for (i = 0; i < length; i++) - if (!hasProp.call(b, keys[i])) return false; - - for (i = 0; i < length; i++) { - key = keys[i]; - if (!equal(a[key], b[key])) return false; - } - - return true; - } - - return false; -}; - -},{}],84:[function(require,module,exports){ -'use strict'; - -module.exports = function (data, opts) { - if (!opts) opts = {}; - if (typeof opts === 'function') opts = { cmp: opts }; - var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false; - - var cmp = opts.cmp && (function (f) { - return function (node) { - return function (a, b) { - var aobj = { key: a, value: node[a] }; - var bobj = { key: b, value: node[b] }; - return f(aobj, bobj); - }; - }; - })(opts.cmp); - - var seen = []; - return (function stringify (node) { - if (node && node.toJSON && typeof node.toJSON === 'function') { - node = node.toJSON(); - } - - if (node === undefined) return; - if (typeof node == 'number') return isFinite(node) ? '' + node : 'null'; - if (typeof node !== 'object') return JSON.stringify(node); - - var i, out; - if (Array.isArray(node)) { - out = '['; - for (i = 0; i < node.length; i++) { - if (i) out += ','; - out += stringify(node[i]) || 'null'; - } - return out + ']'; - } - - if (node === null) return 'null'; - - if (seen.indexOf(node) !== -1) { - if (cycles) return JSON.stringify('__cycle__'); - throw new TypeError('Converting circular structure to JSON'); - } - - var seenIndex = seen.push(node) - 1; - var keys = Object.keys(node).sort(cmp && cmp(node)); - out = ''; - for (i = 0; i < keys.length; i++) { - var key = keys[i]; - var value = stringify(node[key]); - - if (!value) continue; - if (out) out += ','; - out += JSON.stringify(key) + ':' + value; - } - seen.splice(seenIndex, 1); - return '{' + out + '}'; - })(data); -}; - -},{}],85:[function(require,module,exports){ -module.exports = ForeverAgent -ForeverAgent.SSL = ForeverAgentSSL - -var util = require('util') - , Agent = require('http').Agent - , net = require('net') - , tls = require('tls') - , AgentSSL = require('https').Agent - -function getConnectionName(host, port) { - var name = '' - if (typeof host === 'string') { - name = host + ':' + port - } else { - // For node.js v012.0 and iojs-v1.5.1, host is an object. And any existing localAddress is part of the connection name. - name = host.host + ':' + host.port + ':' + (host.localAddress ? (host.localAddress + ':') : ':') - } - return name -} - -function ForeverAgent(options) { - var self = this - self.options = options || {} - self.requests = {} - self.sockets = {} - self.freeSockets = {} - self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets - self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets - self.on('free', function(socket, host, port) { - var name = getConnectionName(host, port) - - if (self.requests[name] && self.requests[name].length) { - self.requests[name].shift().onSocket(socket) - } else if (self.sockets[name].length < self.minSockets) { - if (!self.freeSockets[name]) self.freeSockets[name] = [] - self.freeSockets[name].push(socket) - - // if an error happens while we don't use the socket anyway, meh, throw the socket away - var onIdleError = function() { - socket.destroy() - } - socket._onIdleError = onIdleError - socket.on('error', onIdleError) - } else { - // If there are no pending requests just destroy the - // socket and it will get removed from the pool. This - // gets us out of timeout issues and allows us to - // default to Connection:keep-alive. - socket.destroy() - } - }) - -} -util.inherits(ForeverAgent, Agent) - -ForeverAgent.defaultMinSockets = 5 - - -ForeverAgent.prototype.createConnection = net.createConnection -ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest -ForeverAgent.prototype.addRequest = function(req, host, port) { - var name = getConnectionName(host, port) - - if (typeof host !== 'string') { - var options = host - port = options.port - host = options.host - } - - if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) { - var idleSocket = this.freeSockets[name].pop() - idleSocket.removeListener('error', idleSocket._onIdleError) - delete idleSocket._onIdleError - req._reusedSocket = true - req.onSocket(idleSocket) - } else { - this.addRequestNoreuse(req, host, port) - } -} - -ForeverAgent.prototype.removeSocket = function(s, name, host, port) { - if (this.sockets[name]) { - var index = this.sockets[name].indexOf(s) - if (index !== -1) { - this.sockets[name].splice(index, 1) - } - } else if (this.sockets[name] && this.sockets[name].length === 0) { - // don't leak - delete this.sockets[name] - delete this.requests[name] - } - - if (this.freeSockets[name]) { - var index = this.freeSockets[name].indexOf(s) - if (index !== -1) { - this.freeSockets[name].splice(index, 1) - if (this.freeSockets[name].length === 0) { - delete this.freeSockets[name] - } - } - } - - if (this.requests[name] && this.requests[name].length) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(name, host, port).emit('free') - } -} - -function ForeverAgentSSL (options) { - ForeverAgent.call(this, options) -} -util.inherits(ForeverAgentSSL, ForeverAgent) - -ForeverAgentSSL.prototype.createConnection = createConnectionSSL -ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest - -function createConnectionSSL (port, host, options) { - if (typeof port === 'object') { - options = port; - } else if (typeof host === 'object') { - options = host; - } else if (typeof options === 'object') { - options = options; - } else { - options = {}; - } - - if (typeof port === 'number') { - options.port = port; - } - - if (typeof host === 'string') { - options.host = host; - } - - return tls.connect(options); -} - -},{"http":undefined,"https":undefined,"net":undefined,"tls":undefined,"util":undefined}],86:[function(require,module,exports){ -module.exports={ - "$id": "afterRequest.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "optional": true, - "required": [ - "lastAccess", - "eTag", - "hitCount" - ], - "properties": { - "expires": { - "type": "string", - "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?" - }, - "lastAccess": { - "type": "string", - "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?" - }, - "eTag": { - "type": "string" - }, - "hitCount": { - "type": "integer" - }, - "comment": { - "type": "string" - } - } -} - -},{}],87:[function(require,module,exports){ -module.exports={ - "$id": "beforeRequest.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "optional": true, - "required": [ - "lastAccess", - "eTag", - "hitCount" - ], - "properties": { - "expires": { - "type": "string", - "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?" - }, - "lastAccess": { - "type": "string", - "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?" - }, - "eTag": { - "type": "string" - }, - "hitCount": { - "type": "integer" - }, - "comment": { - "type": "string" - } - } -} - -},{}],88:[function(require,module,exports){ -module.exports={ - "$id": "browser.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "name", - "version" - ], - "properties": { - "name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "comment": { - "type": "string" - } - } -} - -},{}],89:[function(require,module,exports){ -module.exports={ - "$id": "cache.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "properties": { - "beforeRequest": { - "oneOf": [ - { "type": "null" }, - { "$ref": "beforeRequest.json#" } - ] - }, - "afterRequest": { - "oneOf": [ - { "type": "null" }, - { "$ref": "afterRequest.json#" } - ] - }, - "comment": { - "type": "string" - } - } -} - -},{}],90:[function(require,module,exports){ -module.exports={ - "$id": "content.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "size", - "mimeType" - ], - "properties": { - "size": { - "type": "integer" - }, - "compression": { - "type": "integer" - }, - "mimeType": { - "type": "string" - }, - "text": { - "type": "string" - }, - "encoding": { - "type": "string" - }, - "comment": { - "type": "string" - } - } -} - -},{}],91:[function(require,module,exports){ -module.exports={ - "$id": "cookie.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - }, - "path": { - "type": "string" - }, - "domain": { - "type": "string" - }, - "expires": { - "type": ["string", "null"], - "format": "date-time" - }, - "httpOnly": { - "type": "boolean" - }, - "secure": { - "type": "boolean" - }, - "comment": { - "type": "string" - } - } -} - -},{}],92:[function(require,module,exports){ -module.exports={ - "$id": "creator.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "name", - "version" - ], - "properties": { - "name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "comment": { - "type": "string" - } - } -} - -},{}],93:[function(require,module,exports){ -module.exports={ - "$id": "entry.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "optional": true, - "required": [ - "startedDateTime", - "time", - "request", - "response", - "cache", - "timings" - ], - "properties": { - "pageref": { - "type": "string" - }, - "startedDateTime": { - "type": "string", - "format": "date-time", - "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))" - }, - "time": { - "type": "number", - "min": 0 - }, - "request": { - "$ref": "request.json#" - }, - "response": { - "$ref": "response.json#" - }, - "cache": { - "$ref": "cache.json#" - }, - "timings": { - "$ref": "timings.json#" - }, - "serverIPAddress": { - "type": "string", - "oneOf": [ - { "format": "ipv4" }, - { "format": "ipv6" } - ] - }, - "connection": { - "type": "string" - }, - "comment": { - "type": "string" - } - } -} - -},{}],94:[function(require,module,exports){ -module.exports={ - "$id": "har.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "log" - ], - "properties": { - "log": { - "$ref": "log.json#" - } - } -} - -},{}],95:[function(require,module,exports){ -module.exports={ - "$id": "header.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - }, - "comment": { - "type": "string" - } - } -} - -},{}],96:[function(require,module,exports){ -'use strict' - -module.exports = { - afterRequest: require('./afterRequest.json'), - beforeRequest: require('./beforeRequest.json'), - browser: require('./browser.json'), - cache: require('./cache.json'), - content: require('./content.json'), - cookie: require('./cookie.json'), - creator: require('./creator.json'), - entry: require('./entry.json'), - har: require('./har.json'), - header: require('./header.json'), - log: require('./log.json'), - page: require('./page.json'), - pageTimings: require('./pageTimings.json'), - postData: require('./postData.json'), - query: require('./query.json'), - request: require('./request.json'), - response: require('./response.json'), - timings: require('./timings.json') -} - -},{"./afterRequest.json":86,"./beforeRequest.json":87,"./browser.json":88,"./cache.json":89,"./content.json":90,"./cookie.json":91,"./creator.json":92,"./entry.json":93,"./har.json":94,"./header.json":95,"./log.json":97,"./page.json":98,"./pageTimings.json":99,"./postData.json":100,"./query.json":101,"./request.json":102,"./response.json":103,"./timings.json":104}],97:[function(require,module,exports){ -module.exports={ - "$id": "log.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "version", - "creator", - "entries" - ], - "properties": { - "version": { - "type": "string" - }, - "creator": { - "$ref": "creator.json#" - }, - "browser": { - "$ref": "browser.json#" - }, - "pages": { - "type": "array", - "items": { - "$ref": "page.json#" - } - }, - "entries": { - "type": "array", - "items": { - "$ref": "entry.json#" - } - }, - "comment": { - "type": "string" - } - } -} - -},{}],98:[function(require,module,exports){ -module.exports={ - "$id": "page.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "optional": true, - "required": [ - "startedDateTime", - "id", - "title", - "pageTimings" - ], - "properties": { - "startedDateTime": { - "type": "string", - "format": "date-time", - "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))" - }, - "id": { - "type": "string", - "unique": true - }, - "title": { - "type": "string" - }, - "pageTimings": { - "$ref": "pageTimings.json#" - }, - "comment": { - "type": "string" - } - } -} - -},{}],99:[function(require,module,exports){ -module.exports={ - "$id": "pageTimings.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "properties": { - "onContentLoad": { - "type": "number", - "min": -1 - }, - "onLoad": { - "type": "number", - "min": -1 - }, - "comment": { - "type": "string" - } - } -} - -},{}],100:[function(require,module,exports){ -module.exports={ - "$id": "postData.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "optional": true, - "required": [ - "mimeType" - ], - "properties": { - "mimeType": { - "type": "string" - }, - "text": { - "type": "string" - }, - "params": { - "type": "array", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - }, - "fileName": { - "type": "string" - }, - "contentType": { - "type": "string" - }, - "comment": { - "type": "string" - } - } - }, - "comment": { - "type": "string" - } - } -} - -},{}],101:[function(require,module,exports){ -module.exports={ - "$id": "query.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "name", - "value" - ], - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - }, - "comment": { - "type": "string" - } - } -} - -},{}],102:[function(require,module,exports){ -module.exports={ - "$id": "request.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "method", - "url", - "httpVersion", - "cookies", - "headers", - "queryString", - "headersSize", - "bodySize" - ], - "properties": { - "method": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - }, - "httpVersion": { - "type": "string" - }, - "cookies": { - "type": "array", - "items": { - "$ref": "cookie.json#" - } - }, - "headers": { - "type": "array", - "items": { - "$ref": "header.json#" - } - }, - "queryString": { - "type": "array", - "items": { - "$ref": "query.json#" - } - }, - "postData": { - "$ref": "postData.json#" - }, - "headersSize": { - "type": "integer" - }, - "bodySize": { - "type": "integer" - }, - "comment": { - "type": "string" - } - } -} - -},{}],103:[function(require,module,exports){ -module.exports={ - "$id": "response.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "type": "object", - "required": [ - "status", - "statusText", - "httpVersion", - "cookies", - "headers", - "content", - "redirectURL", - "headersSize", - "bodySize" - ], - "properties": { - "status": { - "type": "integer" - }, - "statusText": { - "type": "string" - }, - "httpVersion": { - "type": "string" - }, - "cookies": { - "type": "array", - "items": { - "$ref": "cookie.json#" - } - }, - "headers": { - "type": "array", - "items": { - "$ref": "header.json#" - } - }, - "content": { - "$ref": "content.json#" - }, - "redirectURL": { - "type": "string" - }, - "headersSize": { - "type": "integer" - }, - "bodySize": { - "type": "integer" - }, - "comment": { - "type": "string" - } - } -} - -},{}],104:[function(require,module,exports){ -module.exports={ - "$id": "timings.json#", - "$schema": "http://json-schema.org/draft-06/schema#", - "required": [ - "send", - "wait", - "receive" - ], - "properties": { - "dns": { - "type": "number", - "min": -1 - }, - "connect": { - "type": "number", - "min": -1 - }, - "blocked": { - "type": "number", - "min": -1 - }, - "send": { - "type": "number", - "min": -1 - }, - "wait": { - "type": "number", - "min": -1 - }, - "receive": { - "type": "number", - "min": -1 - }, - "ssl": { - "type": "number", - "min": -1 - }, - "comment": { - "type": "string" - } - } -} - -},{}],105:[function(require,module,exports){ -var big5Table = require('./table/big5.js'); -module.exports = { - 'windows950': 'big5', - 'cp950': 'big5', - 'big5': { - type: 'table', - table: big5Table - } -} - -},{"./table/big5.js":108}],106:[function(require,module,exports){ -var gbkTable = require('./table/gbk.js'); -module.exports = { - 'windows936': 'gbk', - 'gb2312': 'gbk', - 'gbk': { - type: 'table', - table: gbkTable - } -} - -},{"./table/gbk.js":109}],107:[function(require,module,exports){ -module.exports = { - "437": "cp437", - "737": "cp737", - "775": "cp775", - "850": "cp850", - "852": "cp852", - "855": "cp855", - "857": "cp857", - "858": "cp858", - "860": "cp860", - "861": "cp861", - "862": "cp862", - "863": "cp863", - "864": "cp864", - "865": "cp865", - "866": "cp866", - "869": "cp869", - "874": "iso885911", - "1250": "windows1250", - "1251": "windows1251", - "1252": "windows1252", - "1253": "windows1253", - "1254": "windows1254", - "1255": "windows1255", - "1256": "windows1256", - "1257": "windows1257", - "1258": "windows1258", - "10000": "macroman", - "10006": "macgreek", - "10007": "maccyrillic", - "10029": "maccenteuro", - "10079": "maciceland", - "10081": "macturkish", - "20866": "koi8r", - "21866": "koi8u", - "28591": "iso88591", - "28592": "iso88592", - "28593": "iso88593", - "28594": "iso88594", - "28595": "iso88595", - "28596": "iso88596", - "28597": "iso88597", - "28598": "iso88598", - "28599": "iso88599", - "28600": "iso885910", - "28601": "iso885911", - "28603": "iso885913", - "28604": "iso885914", - "28605": "iso885915", - "28606": "iso885916", - "ascii8bit": "ascii", - "usascii": "ascii", - "latin1": "iso88591", - "latin2": "iso88592", - "latin3": "iso88593", - "latin4": "iso88594", - "latin6": "iso885910", - "latin7": "iso885913", - "latin8": "iso885914", - "latin9": "iso885915", - "latin10": "iso885916", - "cp819": "iso88951", - "arabic": "iso88596", - "arabic8": "iso88596", - "greek": "iso88597", - "greek8": "iso88597", - "hebrew": "iso88598", - "hebrew8": "iso88598", - "turkish": "iso88599", - "turkish8": "iso88599", - "thai": "iso885911", - "thai8": "iso885911", - "tis620": "iso885911", - "windows874": "iso885911", - "win874": "iso885911", - "cp874": "iso885911", - "celtic": "iso885914", - "celtic8": "iso885914", - "cp20866": "koi8r", - "ibm878": "koi8r", - "cp21866": "koi8u", - "ibm1168": "koi8u", - "windows1250": { - "type": "singlebyte", - "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" - }, - "win1250": "windows1250", - "cp1250": "windows1250", - "windows1251": { - "type": "singlebyte", - "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" - }, - "win1251": "windows1251", - "cp1251": "windows1251", - "windows1252": { - "type": "singlebyte", - "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "win1252": "windows1252", - "cp1252": "windows1252", - "windows1253": { - "type": "singlebyte", - "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�" - }, - "win1253": "windows1253", - "cp1253": "windows1253", - "windows1254": { - "type": "singlebyte", - "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" - }, - "win1254": "windows1254", - "cp1254": "windows1254", - "windows1255": { - "type": "singlebyte", - "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�" - }, - "win1255": "windows1255", - "cp1255": "windows1255", - "windows1256": { - "type": "singlebyte", - "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے" - }, - "win1256": "windows1256", - "cp1256": "windows1256", - "windows1257": { - "type": "singlebyte", - "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙" - }, - "win1257": "windows1257", - "cp1257": "windows1257", - "windows1258": { - "type": "singlebyte", - "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ" - }, - "win1258": "windows1258", - "cp1258": "windows1258", - "iso88591": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "cp28591": "iso88591", - "iso88592": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" - }, - "cp28592": "iso88592", - "iso88593": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ħ˘£¤�Ĥ§¨İŞĞĴ­�ݰħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙" - }, - "cp28593": "iso88593", - "iso88594": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĸŖ¤Ĩϧ¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩšēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖרŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙" - }, - "cp28594": "iso88594", - "iso88595": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ" - }, - "cp28595": "iso88595", - "iso88596": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������" - }, - "cp28596": "iso88596", - "iso88597": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�" - }, - "cp28597": "iso88597", - "iso88598": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�" - }, - "cp28598": "iso88598", - "iso88599": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" - }, - "cp28599": "iso88599", - "iso885910": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĒĢĪĨͧĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ" - }, - "cp28600": "iso885910", - "iso885911": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" - }, - "cp28601": "iso885911", - "iso885913": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’" - }, - "cp28603": "iso885913", - "iso885914": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ" - }, - "cp28604": "iso885914", - "iso885915": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "cp28605": "iso885915", - "iso885916": { - "type": "singlebyte", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄąŁ€„Чš©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ" - }, - "cp28606": "iso885916", - "cp437": { - "type": "singlebyte", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm437": "cp437", - "cp737": { - "type": "singlebyte", - "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ " - }, - "ibm737": "cp737", - "cp775": { - "type": "singlebyte", - "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ " - }, - "ibm775": "cp775", - "cp850": { - "type": "singlebyte", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ " - }, - "ibm850": "cp850", - "cp852": { - "type": "singlebyte", - "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ " - }, - "ibm852": "cp852", - "cp855": { - "type": "singlebyte", - "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ " - }, - "ibm855": "cp855", - "cp857": { - "type": "singlebyte", - "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ " - }, - "ibm857": "cp857", - "cp858": { - "type": "singlebyte", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ " - }, - "ibm858": "cp858", - "cp860": { - "type": "singlebyte", - "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm860": "cp860", - "cp861": { - "type": "singlebyte", - "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm861": "cp861", - "cp862": { - "type": "singlebyte", - "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm862": "cp862", - "cp863": { - "type": "singlebyte", - "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm863": "cp863", - "cp864": { - "type": "singlebyte", - "chars": "°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�" - }, - "ibm864": "cp864", - "cp865": { - "type": "singlebyte", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm865": "cp865", - "cp866": { - "type": "singlebyte", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ " - }, - "ibm866": "cp866", - "cp869": { - "type": "singlebyte", - "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ " - }, - "ibm869": "cp869", - "maccenteuro": { - "type": "singlebyte", - "chars": "ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ" - }, - "maccroatian": { - "type": "singlebyte", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈ƫȅ ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ" - }, - "maccyrillic": { - "type": "singlebyte", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤" - }, - "macgreek": { - "type": "singlebyte", - "chars": "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�" - }, - "maciceland": { - "type": "singlebyte", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macroman": { - "type": "singlebyte", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macromania": { - "type": "singlebyte", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macthai": { - "type": "singlebyte", - "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����" - }, - "macturkish": { - "type": "singlebyte", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macukraine": { - "type": "singlebyte", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤" - }, - "koi8r": { - "type": "singlebyte", - "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" - }, - "koi8u": { - "type": "singlebyte", - "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" - } -}; - -},{}],108:[function(require,module,exports){ -module.exports={"33088":19991,"33089":20002,"33090":20012,"33091":20053,"33092":20066,"33093":20106,"33094":20144,"33095":20203,"33096":20205,"33097":20220,"33098":20252,"33099":20362,"33100":20479,"33101":20546,"33102":20560,"33103":20600,"33104":20696,"33105":20702,"33106":20724,"33107":20758,"33108":20810,"33109":20817,"33110":20836,"33111":20842,"33112":20869,"33113":20880,"33114":20893,"33115":20902,"33116":20904,"33117":20905,"33118":20935,"33119":20950,"33120":20955,"33121":20972,"33122":20988,"33123":21003,"33124":21012,"33125":21013,"33126":21024,"33127":21035,"33128":21049,"33129":21071,"33130":21105,"33131":21136,"33132":21138,"33133":21140,"33134":21148,"33135":21167,"33136":21173,"33137":21200,"33138":21248,"33139":21255,"33140":21284,"33141":21318,"33142":21343,"33143":21395,"33144":21424,"33145":21469,"33146":21539,"33147":21584,"33148":21585,"33149":21642,"33150":21661,"33185":21667,"33186":21684,"33187":21712,"33188":21795,"33189":21823,"33190":21836,"33191":21843,"33192":21853,"33193":21868,"33194":21918,"33195":21929,"33196":21996,"33197":22005,"33198":22051,"33199":22096,"33200":22140,"33201":22154,"33202":22164,"33203":22176,"33204":22191,"33205":22232,"33206":22272,"33207":22361,"33208":22373,"33209":22399,"33210":22405,"33211":22409,"33212":22433,"33213":22444,"33214":22452,"33215":22464,"33216":22472,"33217":22483,"33218":22511,"33219":22596,"33220":22636,"33221":22674,"33222":22682,"33223":22706,"33224":22712,"33225":22757,"33226":22779,"33227":22786,"33228":22795,"33229":22800,"33230":22808,"33231":22811,"33232":29836,"33233":29837,"33234":29849,"33235":29851,"33236":29860,"33237":29876,"33238":29881,"33239":29896,"33240":29900,"33241":29904,"33242":29907,"33243":30018,"33244":30037,"33245":30062,"33246":30093,"33247":30110,"33248":30172,"33249":30252,"33250":30287,"33251":30289,"33252":30323,"33253":30324,"33254":30373,"33255":30425,"33256":30478,"33257":30479,"33258":30552,"33259":30578,"33260":30583,"33261":30584,"33262":30586,"33263":30587,"33264":30616,"33265":30639,"33266":30654,"33267":30659,"33268":30661,"33269":30667,"33270":30685,"33271":30694,"33272":30708,"33273":30750,"33274":30781,"33275":30786,"33276":30788,"33277":30795,"33278":30801,"33344":21782,"33345":22775,"33346":38964,"33347":33883,"33348":28948,"33349":33398,"33350":35158,"33351":40236,"33352":40206,"33353":36527,"33354":24674,"33355":26214,"33356":34510,"33357":25785,"33358":37772,"33359":22107,"33360":28485,"33361":35532,"33362":29001,"33363":24012,"33364":34633,"33365":39464,"33366":31658,"33367":36107,"33368":39255,"33369":23597,"33370":32331,"33371":38938,"33372":20518,"33373":25458,"33374":40568,"33375":30783,"33376":40633,"33377":40634,"33378":36046,"33379":35715,"33380":61305,"33381":33931,"33382":37284,"33383":31331,"33384":25776,"33385":24061,"33386":24214,"33387":32865,"33388":26965,"33389":31466,"33390":28710,"33391":26812,"33392":31095,"33393":28060,"33394":36841,"33395":31074,"33396":22178,"33397":34687,"33398":21093,"33399":31108,"33400":28300,"33401":37271,"33402":31622,"33403":38956,"33404":26717,"33405":20397,"33406":34222,"33441":31725,"33442":34635,"33443":20534,"33444":26893,"33445":27542,"33446":24910,"33447":20855,"33448":30495,"33449":20516,"33450":32622,"33451":30452,"33452":27097,"33453":24803,"33454":25334,"33455":21599,"33456":38788,"33457":22092,"33458":20677,"33459":22040,"33460":34398,"33461":22834,"33462":22875,"33463":22877,"33464":22883,"33465":22892,"33466":22939,"33467":22999,"33468":23019,"33469":23066,"33470":23210,"33471":23248,"33472":23281,"33473":23350,"33474":23497,"33475":23539,"33476":23571,"33477":23580,"33478":23582,"33479":23635,"33480":23705,"33481":23708,"33482":23738,"33483":23739,"33484":23745,"33485":23797,"33486":23802,"33487":23829,"33488":23832,"33489":23870,"33490":23891,"33491":23900,"33492":23917,"33493":23923,"33494":23924,"33495":23948,"33496":23952,"33497":23993,"33498":24016,"33499":24019,"33500":24135,"33501":24164,"33502":24271,"33503":24272,"33504":24298,"33505":24304,"33506":24329,"33507":24332,"33508":24337,"33509":24353,"33510":24372,"33511":24385,"33512":24389,"33513":24401,"33514":24412,"33515":24422,"33516":24451,"33517":24560,"33518":24650,"33519":24672,"33520":24715,"33521":24742,"33522":24798,"33523":24849,"33524":24864,"33525":24865,"33526":24892,"33527":24893,"33528":24984,"33529":25015,"33530":25076,"33531":25107,"33532":25117,"33533":25118,"33534":25143,"33600":24186,"33601":27664,"33602":21454,"33603":20267,"33604":20302,"33605":21556,"33606":22257,"33607":22766,"33608":22841,"33609":22918,"33610":23596,"33611":20915,"33612":20914,"33613":28798,"33614":35265,"33615":35282,"33616":36125,"33617":36710,"33618":20122,"33619":26469,"33620":20177,"33621":20004,"33622":21327,"33623":23626,"33624":20872,"33625":24213,"33626":25269,"33627":19996,"33628":20105,"33629":29366,"33630":31868,"33631":32416,"33632":21351,"33633":36711,"33634":37048,"33635":38271,"33636":38376,"33637":20384,"33638":20387,"33639":20822,"33640":21017,"33641":21170,"33642":21364,"33643":22850,"33644":24069,"33645":26594,"33646":27769,"33647":20026,"33648":32419,"33649":32418,"33650":32426,"33651":32427,"33652":32421,"33653":32422,"33654":32417,"33655":32989,"33656":33486,"33657":35745,"33658":35746,"33659":35747,"33660":36126,"33661":36127,"33662":20891,"33697":36712,"33698":38377,"33699":38886,"33700":39029,"33701":39118,"33702":39134,"33703":20457,"33704":20204,"33705":20261,"33706":20010,"33707":20262,"33708":20179,"33709":20923,"33710":21018,"33711":21093,"33712":21592,"33713":23089,"33714":23385,"33715":23777,"33716":23707,"33717":23704,"33718":24072,"33719":24211,"33720":24452,"33721":25375,"33722":26102,"33723":26187,"33724":20070,"33725":27902,"33726":27971,"33727":20044,"33728":29421,"33729":29384,"33730":20137,"33731":30757,"33732":31210,"33733":32442,"33734":32433,"33735":32441,"33736":32431,"33737":32445,"33738":32432,"33739":32423,"33740":32429,"33741":32435,"33742":32440,"33743":32439,"33744":32961,"33745":33033,"33746":21005,"33747":35760,"33748":35750,"33749":35752,"33750":35751,"33751":35754,"33752":35759,"33753":35757,"33754":35755,"33755":23682,"33756":36130,"33757":36129,"33758":36713,"33759":36715,"33760":38025,"33761":38024,"33762":38026,"33763":38027,"33764":38378,"33765":38453,"33766":38485,"33767":38473,"33768":39269,"33769":39532,"33770":39592,"33771":20266,"33772":20255,"33773":20390,"33774":20391,"33775":21153,"33776":21160,"33777":21306,"33778":21442,"33779":21713,"33780":38382,"33781":34900,"33782":22269,"33783":22362,"33784":22441,"33785":25191,"33786":22815,"33787":23044,"33788":22919,"33789":19987,"33790":23558,"33856":23625,"33857":23781,"33858":23703,"33859":24102,"33860":24080,"33861":24352,"33862":24378,"33863":20174,"33864":24469,"33865":20932,"33866":24581,"33867":25195,"33868":25346,"33869":25194,"33870":25249,"33871":25379,"33872":36133,"33873":21551,"33874":26011,"33875":26025,"33876":26172,"33877":21206,"33878":24323,"33879":26465,"33880":26541,"33881":26432,"33882":27682,"33883":20937,"33884":27973,"33885":28170,"33886":27882,"33887":27814,"33888":20928,"33889":29301,"33890":29424,"33891":29616,"33892":20135,"33893":27605,"33894":24322,"33895":20247,"33896":32458,"33897":32479,"33898":32461,"33899":32459,"33900":32460,"33901":32454,"33902":32453,"33903":32452,"33904":32456,"33905":32449,"33906":32450,"33907":38069,"33908":20064,"33909":33626,"33910":33550,"33911":33682,"33912":24196,"33913":33483,"33914":22788,"33915":26415,"33916":34926,"33917":35269,"33918":35268,"33953":35775,"33954":35766,"33955":35776,"33956":35767,"33957":35768,"33958":35774,"33959":35772,"33960":35769,"33961":36137,"33962":36131,"33963":36143,"33964":36135,"33965":36138,"33966":36139,"33967":36717,"33968":36719,"33969":36825,"33970":36830,"33971":36851,"33972":38039,"33973":38035,"33974":38031,"33975":38034,"33976":38381,"33977":38472,"33978":38470,"33979":38452,"33980":39030,"33981":39031,"33982":40060,"33983":40479,"33984":21348,"33985":40614,"33986":22791,"33987":20263,"33988":20254,"33989":20975,"33990":21056,"33991":21019,"33992":21171,"33993":21195,"33994":20007,"33995":21333,"33996":21727,"33997":21796,"33998":20052,"33999":22260,"34000":23591,"34001":22330,"34002":25253,"34003":22490,"34004":22774,"34005":23090,"34006":23547,"34007":23706,"34008":24103,"34009":24079,"34010":21397,"34011":21417,"34012":24694,"34013":38391,"34014":24812,"34015":24699,"34016":24700,"34017":25315,"34018":25381,"34019":25442,"34020":25196,"34021":26531,"34022":26635,"34023":26632,"34024":38054,"34025":27531,"34026":22771,"34027":27695,"34028":27689,"34029":28044,"34030":20945,"34031":28270,"34032":28065,"34033":27748,"34034":27979,"34035":27985,"34036":28067,"34037":26080,"34038":29369,"34039":33487,"34040":30011,"34041":30153,"34042":21457,"34043":30423,"34044":30746,"34045":31174,"34046":31383,"34112":31508,"34113":31499,"34114":32478,"34115":32467,"34116":32466,"34117":32477,"34118":19997,"34119":32476,"34120":32473,"34121":32474,"34122":32470,"34123":32475,"34124":32899,"34125":32958,"34126":32960,"34127":21326,"34128":33713,"34129":33484,"34130":34394,"34131":35270,"34132":35780,"34133":35789,"34134":35777,"34135":35778,"34136":35791,"34137":35781,"34138":35784,"34139":35787,"34140":35785,"34141":35786,"34142":35779,"34143":36142,"34144":36148,"34145":36144,"34146":36155,"34147":36146,"34148":36153,"34149":36154,"34150":36149,"34151":20080,"34152":36140,"34153":36152,"34154":36151,"34155":36722,"34156":36724,"34157":36726,"34158":36827,"34159":37038,"34160":20065,"34161":38046,"34162":38062,"34163":38041,"34164":38048,"34165":38055,"34166":38045,"34167":38052,"34168":38051,"34169":38389,"34170":38384,"34171":24320,"34172":38386,"34173":38388,"34174":38387,"34209":38431,"34210":38454,"34211":38451,"34212":38887,"34213":39033,"34214":39034,"34215":39035,"34216":39274,"34217":39277,"34218":39272,"34219":39278,"34220":39276,"34221":20911,"34222":39533,"34223":20081,"34224":20538,"34225":20256,"34226":20165,"34227":20542,"34228":20260,"34229":20588,"34230":38130,"34231":21183,"34232":31215,"34233":27719,"34234":21527,"34235":21596,"34236":21595,"34237":22253,"34238":22278,"34239":28034,"34240":22359,"34241":22366,"34242":22488,"34243":33556,"34244":22885,"34245":22920,"34246":29233,"34247":24574,"34248":24582,"34249":24698,"34250":25439,"34251":25250,"34252":25443,"34253":26500,"34254":26198,"34255":26197,"34256":26104,"34257":20250,"34258":19994,"34259":26497,"34260":26472,"34261":26722,"34262":26539,"34263":23681,"34264":27807,"34265":28781,"34266":28287,"34267":28369,"34268":27815,"34269":28902,"34270":28860,"34271":28800,"34272":28949,"34273":29239,"34274":29422,"34275":29502,"34276":29682,"34277":24403,"34278":30415,"34279":30544,"34280":30529,"34281":38606,"34282":30860,"34283":33410,"34284":31509,"34285":31908,"34286":32463,"34287":32482,"34288":32465,"34289":32485,"34290":32486,"34291":20041,"34292":32673,"34293":22307,"34294":32928,"34295":33050,"34296":32959,"34297":33041,"34298":33636,"34299":33479,"34300":21494,"34301":33716,"34302":34398,"34368":34383,"34369":21495,"34370":34568,"34371":34476,"34372":34917,"34373":35013,"34374":35815,"34375":35813,"34376":35814,"34377":35797,"34378":35799,"34379":35800,"34380":35801,"34381":35811,"34382":35802,"34383":35805,"34384":35803,"34385":35809,"34386":35810,"34387":35808,"34388":35807,"34389":36156,"34390":36164,"34391":36158,"34392":36159,"34393":36160,"34394":36161,"34395":36162,"34396":36165,"34397":36739,"34398":36733,"34399":36732,"34400":36734,"34401":20892,"34402":36816,"34403":36798,"34404":36829,"34405":36807,"34406":37049,"34407":38068,"34408":38067,"34409":38073,"34410":38072,"34411":38078,"34412":38080,"34413":38085,"34414":38057,"34415":38082,"34416":38083,"34417":38089,"34418":38091,"34419":38044,"34420":38093,"34421":38079,"34422":38086,"34423":38392,"34424":38504,"34425":38589,"34426":30005,"34427":39044,"34428":39037,"34429":39039,"34430":39036,"34465":39041,"34466":39042,"34467":39282,"34468":39284,"34469":39281,"34470":39280,"34471":39536,"34472":39534,"34473":39535,"34474":40480,"34475":20389,"34476":20392,"34477":21294,"34478":21388,"34479":23581,"34480":21589,"34481":21497,"34482":21949,"34483":21863,"34484":21716,"34485":22242,"34486":22270,"34487":23576,"34488":22443,"34489":22545,"34490":23551,"34491":26790,"34492":22842,"34493":22849,"34494":22954,"34495":23454,"34496":23517,"34497":23545,"34498":23649,"34499":23853,"34500":23702,"34501":24065,"34502":24124,"34503":24443,"34504":24577,"34505":24815,"34506":24696,"34507":24813,"34508":24808,"34509":25602,"34510":25524,"34511":25530,"34512":30021,"34513":33635,"34514":26538,"34515":28378,"34516":28173,"34517":27721,"34518":28385,"34519":28382,"34520":28176,"34521":28072,"34522":28063,"34523":27818,"34524":28180,"34525":28183,"34526":28068,"34527":33639,"34528":23572,"34529":33638,"34530":29425,"34531":29712,"34532":29595,"34533":30111,"34534":30113,"34535":30127,"34536":30186,"34537":23613,"34538":30417,"34539":30805,"34540":31087,"34541":31096,"34542":31181,"34543":31216,"34544":27964,"34545":31389,"34546":31546,"34547":31581,"34548":32509,"34549":32510,"34550":32508,"34551":32496,"34552":32491,"34553":32511,"34554":32039,"34555":32512,"34556":32434,"34557":32494,"34558":32504,"34624":32501,"34625":32438,"34626":32500,"34627":32490,"34628":32513,"34629":32502,"34630":32602,"34631":38395,"34632":33669,"34633":30422,"34634":33642,"34635":33485,"34636":34432,"34637":35829,"34638":35821,"34639":35820,"34640":35748,"34641":35819,"34642":35823,"34643":35828,"34644":35824,"34645":35826,"34646":35825,"34647":35827,"34648":35822,"34649":23486,"34650":36168,"34651":36170,"34652":36213,"34653":36214,"34654":36741,"34655":36740,"34656":36731,"34657":36828,"34658":36874,"34659":36882,"34660":38128,"34661":38134,"34662":38108,"34663":38125,"34664":38114,"34665":38124,"34666":38120,"34667":38133,"34668":38115,"34669":38402,"34670":38394,"34671":38397,"34672":38401,"34673":38400,"34674":38469,"34675":39047,"34676":39046,"34677":39122,"34678":39290,"34679":39292,"34680":39285,"34681":39287,"34682":39539,"34683":32942,"34684":39600,"34685":40483,"34686":40482,"34721":20964,"34722":40784,"34723":20159,"34724":20202,"34725":20215,"34726":20396,"34727":20393,"34728":20461,"34729":21095,"34730":21016,"34731":21073,"34732":21053,"34733":21385,"34734":21792,"34735":22068,"34736":21719,"34737":22040,"34738":21943,"34739":21880,"34740":21501,"34741":22687,"34742":22367,"34743":22368,"34744":22549,"34745":23092,"34746":23157,"34747":22953,"34748":23047,"34749":23046,"34750":23485,"34751":23457,"34752":20889,"34753":23618,"34754":23956,"34755":24092,"34756":24223,"34757":21416,"34758":24217,"34759":21422,"34760":24191,"34761":24377,"34762":24198,"34763":34385,"34764":24551,"34765":24578,"34766":24751,"34767":24814,"34768":24868,"34769":24579,"34770":25370,"34771":25169,"34772":25438,"34773":25320,"34774":25376,"34775":25242,"34776":25528,"34777":25599,"34778":25932,"34779":25968,"34780":26242,"34781":26165,"34782":26679,"34783":26729,"34784":26530,"34785":26631,"34786":27004,"34787":26728,"34788":20048,"34789":26526,"34790":27431,"34791":27527,"34792":27572,"34793":27974,"34794":27900,"34795":27905,"34796":27975,"34797":28291,"34798":28070,"34799":28071,"34800":27988,"34801":28909,"34802":22870,"34803":33721,"34804":30126,"34805":30353,"34806":30385,"34807":30424,"34808":30830,"34809":30721,"34810":31377,"34811":31351,"34812":32532,"34813":32451,"34814":32428,"34880":32516,"34881":32517,"34882":32521,"34883":32534,"34884":32536,"34885":32447,"34886":32526,"34887":32531,"34888":32525,"34889":32514,"34890":32520,"34891":32519,"34892":39554,"34893":32610,"34894":33014,"34895":32932,"34896":33714,"34897":33643,"34898":33931,"34899":34430,"34900":34583,"34901":21355,"34902":35850,"34903":35845,"34904":35848,"34905":35846,"34906":35806,"34907":35831,"34908":35832,"34909":35838,"34910":35839,"34911":35844,"34912":35843,"34913":35841,"34914":35770,"34915":35812,"34916":35847,"34917":35837,"34918":35840,"34919":31446,"34920":36180,"34921":36175,"34922":36171,"34923":36145,"34924":36134,"34925":36172,"34926":36132,"34927":21334,"34928":36176,"34929":36136,"34930":36179,"34931":36341,"34932":36745,"34933":36742,"34934":36749,"34935":36744,"34936":36743,"34937":36718,"34938":36750,"34939":36747,"34940":36746,"34941":36866,"34942":36801,"34977":37051,"34978":37073,"34979":37011,"34980":38156,"34981":38161,"34982":38144,"34983":38138,"34984":38096,"34985":38148,"34986":38109,"34987":38160,"34988":38153,"34989":38155,"34990":38049,"34991":38146,"34992":38398,"34993":38405,"34994":24041,"34995":39049,"34996":39052,"34997":20859,"34998":39295,"34999":39297,"35000":39548,"35001":39547,"35002":39543,"35003":39542,"35004":39549,"35005":39550,"35006":39545,"35007":39544,"35008":39607,"35009":38393,"35010":40063,"35011":40065,"35012":40489,"35013":40486,"35014":40632,"35015":40831,"35016":20454,"35017":20647,"35018":20394,"35019":24130,"35020":21058,"35021":21544,"35022":21725,"35023":22003,"35024":22438,"35025":22363,"35026":22859,"35027":34949,"35028":23398,"35029":23548,"35030":23466,"35031":20973,"35032":24811,"35033":25044,"35034":24518,"35035":25112,"35036":25317,"35037":25377,"35038":25374,"35039":25454,"35040":25523,"35041":25321,"35042":25441,"35043":25285,"35044":25373,"35045":21382,"35046":26195,"35047":26196,"35048":26137,"35049":26726,"35050":27178,"35051":26641,"35052":26925,"35053":26725,"35054":26426,"35055":26721,"35056":28096,"35057":27987,"35058":27901,"35059":27978,"35060":27811,"35061":28582,"35062":28177,"35063":28861,"35064":28903,"35065":28783,"35066":28907,"35067":28950,"35068":29420,"35069":29585,"35070":29935,"35136":30232,"35137":21346,"35138":30610,"35139":30742,"35140":30875,"35141":31215,"35142":39062,"35143":31267,"35144":31397,"35145":31491,"35146":31579,"35147":32546,"35148":32547,"35149":33830,"35150":32538,"35151":21439,"35152":32543,"35153":32540,"35154":32537,"35155":32457,"35156":33147,"35157":20852,"35158":33329,"35159":33633,"35160":33831,"35161":33436,"35162":34434,"35163":33828,"35164":35044,"35165":20146,"35166":35278,"35167":35867,"35168":35866,"35169":35855,"35170":35763,"35171":35851,"35172":35853,"35173":35856,"35174":35864,"35175":35834,"35176":35858,"35177":35859,"35178":35773,"35179":35861,"35180":35865,"35181":35852,"35182":35862,"35183":36182,"35184":36752,"35185":36753,"35186":36755,"35187":36751,"35188":21150,"35189":36873,"35190":36831,"35191":36797,"35192":36951,"35193":37050,"35194":38189,"35195":38191,"35196":38192,"35197":38169,"35198":38065,"35233":38050,"35234":38177,"35235":24405,"35236":38126,"35237":38181,"35238":38182,"35239":38175,"35240":38178,"35241":38193,"35242":38414,"35243":38543,"35244":38505,"35245":38745,"35246":33148,"35247":39050,"35248":39048,"35249":39057,"35250":39060,"35251":22836,"35252":39059,"35253":39056,"35254":39302,"35255":39279,"35256":39300,"35257":39301,"35258":39559,"35259":39560,"35260":39558,"35261":39608,"35262":39612,"35263":40077,"35264":40501,"35265":40490,"35266":40495,"35267":40493,"35268":40499,"35269":40857,"35270":40863,"35271":20248,"35272":20607,"35273":20648,"35274":21169,"35275":21659,"35276":21523,"35277":21387,"35278":22489,"35279":23156,"35280":23252,"35281":23351,"35282":23604,"35283":23654,"35284":23679,"35285":23896,"35286":24110,"35287":24357,"35288":24212,"35289":24691,"35290":25103,"35291":20987,"35292":25380,"35293":25319,"35294":25311,"35295":25601,"35296":25947,"35297":27609,"35298":26279,"35299":26723,"35300":26816,"35301":26727,"35302":26633,"35303":27183,"35304":27539,"35305":27617,"35306":27870,"35307":28392,"35308":27982,"35309":28059,"35310":28389,"35311":28073,"35312":28493,"35313":33829,"35314":28799,"35315":28891,"35316":28905,"35317":22681,"35318":29406,"35319":33719,"35320":29615,"35321":29815,"35322":30184,"35323":30103,"35324":30699,"35325":30970,"35326":30710,"35392":31699,"35393":31914,"35394":38214,"35395":31937,"35396":32553,"35397":32489,"35398":32554,"35399":32533,"35400":32551,"35401":32503,"35402":32541,"35403":24635,"35404":32437,"35405":32555,"35406":32420,"35407":32549,"35408":32358,"35409":32550,"35410":22768,"35411":32874,"35412":32852,"35413":32824,"35414":33043,"35415":32966,"35416":33080,"35417":33037,"35418":20020,"35419":20030,"35420":33392,"35421":34103,"35422":34015,"35423":20111,"35424":34684,"35425":34632,"35426":20149,"35427":35099,"35428":35274,"35429":35868,"35430":35876,"35431":35878,"35432":35762,"35433":35854,"35434":35875,"35435":35874,"35436":35466,"35437":35879,"35438":36186,"35439":36187,"35440":36141,"35441":36185,"35442":36235,"35443":36758,"35444":36759,"35445":27586,"35446":36757,"35447":33286,"35448":36824,"35449":36808,"35450":37213,"35451":38208,"35452":38209,"35453":38170,"35454":38190,"35489":38194,"35490":38149,"35491":38180,"35492":38202,"35493":38201,"35494":38203,"35495":38206,"35496":38199,"35497":38420,"35498":38421,"35499":38417,"35500":38385,"35501":38544,"35502":38582,"35503":34429,"35504":38889,"35505":39063,"35506":39123,"35507":39563,"35508":39567,"35509":40092,"35510":40091,"35511":40084,"35512":40081,"35513":40511,"35514":40509,"35515":28857,"35516":25995,"35517":19995,"35518":22108,"35519":22329,"35520":22418,"35521":23158,"35522":25041,"35523":25193,"35524":25527,"35525":25200,"35526":25781,"35527":25670,"35528":25822,"35529":25783,"35530":26029,"35531":27103,"35532":26588,"35533":27099,"35534":26592,"35535":27428,"35536":24402,"35537":27553,"35538":27899,"35539":28182,"35540":28388,"35541":28174,"35542":28293,"35543":27983,"35544":28908,"35545":28952,"35546":29367,"35547":29454,"35548":29934,"35549":30112,"35550":30545,"35551":30784,"35552":31036,"35553":31313,"35554":31229,"35555":31388,"35556":31373,"35557":31659,"35558":31783,"35559":31658,"35560":31697,"35561":31616,"35562":31918,"35563":32455,"35564":32558,"35565":32469,"35566":32557,"35567":32483,"35568":32559,"35569":32728,"35570":32844,"35571":32834,"35572":33040,"35573":33169,"35574":26087,"35575":33832,"35576":34013,"35577":33632,"35578":34546,"35579":34633,"35580":35280,"35581":35294,"35582":35871,"35648":35880,"35649":35884,"35650":35882,"35651":36184,"35652":36434,"35653":36857,"35654":36344,"35655":36527,"35656":36716,"35657":36761,"35658":36841,"35659":21307,"35660":37233,"35661":38225,"35662":38145,"35663":38056,"35664":38221,"35665":38215,"35666":38224,"35667":38226,"35668":38217,"35669":38422,"35670":38383,"35671":38423,"35672":38425,"35673":26434,"35674":21452,"35675":38607,"35676":40481,"35677":39069,"35678":39068,"35679":39064,"35680":39066,"35681":39067,"35682":39311,"35683":39306,"35684":39304,"35685":39569,"35686":39617,"35687":40104,"35688":40100,"35689":40107,"35690":40103,"35691":40515,"35692":40517,"35693":40516,"35694":22404,"35695":22364,"35696":23456,"35697":24222,"35698":24208,"35699":24809,"35700":24576,"35701":25042,"35702":25314,"35703":26103,"35704":27249,"35705":26911,"35706":27016,"35707":27257,"35708":28487,"35709":28625,"35710":27813,"35745":28626,"35746":27896,"35747":28865,"35748":29261,"35749":29322,"35750":20861,"35751":29549,"35752":29626,"35753":29756,"35754":30068,"35755":30250,"35756":30861,"35757":31095,"35758":31283,"35759":31614,"35760":33575,"35761":32462,"35762":32499,"35763":32472,"35764":32599,"35765":32564,"35766":33211,"35767":33402,"35768":34222,"35769":33647,"35770":34433,"35771":34631,"35772":35014,"35773":34948,"35774":35889,"35775":35782,"35776":35885,"35777":35890,"35778":35749,"35779":35887,"35780":36192,"35781":36190,"35782":36343,"35783":36762,"35784":36735,"35785":36766,"35786":36793,"35787":38236,"35788":38237,"35789":38238,"35790":38142,"35791":38231,"35792":38232,"35793":38230,"35794":38233,"35795":38197,"35796":38210,"35797":38143,"35798":37694,"35799":20851,"35800":38471,"35801":38590,"35802":38654,"35803":38892,"35804":38901,"35805":31867,"35806":39072,"35807":39125,"35808":39314,"35809":39313,"35810":39579,"35811":39575,"35812":40120,"35813":40115,"35814":40109,"35815":40119,"35816":40529,"35817":40521,"35818":40522,"35819":40524,"35820":40527,"35821":20029,"35822":40628,"35823":21149,"35824":21657,"35825":22052,"35826":20005,"35827":23453,"35828":24748,"35829":24527,"35830":25318,"35831":25600,"35832":32999,"35833":27015,"35834":28572,"35835":28491,"35836":28809,"35837":29649,"35838":30719,"35904":30778,"35905":30718,"35906":30782,"35907":31398,"35908":31454,"35909":31609,"35910":31726,"35911":36779,"35912":32548,"35913":32487,"35914":32578,"35915":33002,"35916":33328,"35917":34108,"35918":34106,"35919":33446,"35920":33529,"35921":34164,"35922":34461,"35923":35124,"35924":35273,"35925":35302,"35926":35758,"35927":35793,"35928":35893,"35929":36194,"35930":36193,"35931":36280,"35932":37322,"35933":38047,"35934":38105,"35935":38152,"35936":38416,"35937":39128,"35938":39286,"35939":39269,"35940":39582,"35941":33150,"35942":39578,"35943":40131,"35944":40133,"35945":20826,"35946":40835,"35947":40836,"35948":20458,"35949":21995,"35950":21869,"35951":22179,"35952":23646,"35953":24807,"35954":24913,"35955":25668,"35956":25658,"35957":26003,"35958":27185,"35959":26639,"35960":26818,"35961":27516,"35962":28866,"35963":29306,"35964":38262,"35965":29838,"35966":30302,"36001":32544,"36002":32493,"36003":20848,"36004":34259,"36005":34510,"36006":35272,"36007":35892,"36008":25252,"36009":35465,"36010":36163,"36011":36364,"36012":36291,"36013":36347,"36014":36720,"36015":36777,"36016":38256,"36017":38253,"36018":38081,"36019":38107,"36020":38094,"36021":38255,"36022":38220,"36023":21709,"36024":39038,"36025":39074,"36026":39144,"36027":39537,"36028":39584,"36029":34022,"36030":39585,"36031":39621,"36032":40141,"36033":40143,"36034":33722,"36035":40548,"36036":40542,"36037":40839,"36038":40840,"36039":21870,"36040":20456,"36041":20645,"36042":21587,"36043":23402,"36044":24005,"36045":23782,"36046":24367,"36047":25674,"36048":26435,"36049":27426,"36050":28393,"36051":29473,"36052":21472,"36053":30270,"36054":30307,"36055":31548,"36056":31809,"36057":32843,"36058":33039,"36059":34989,"36060":34924,"36061":35835,"36062":36174,"36063":36189,"36064":36399,"36065":36396,"36066":36756,"36067":37094,"36068":38136,"36069":37492,"36070":38657,"36071":38801,"36072":32366,"36073":39076,"36074":39556,"36075":39553,"36076":40150,"36077":40098,"36078":40148,"36079":40151,"36080":40551,"36081":40485,"36082":40761,"36083":40841,"36084":40842,"36085":40858,"36086":24651,"36087":25371,"36088":25605,"36089":29906,"36090":31363,"36091":32552,"36092":33250,"36093":33821,"36094":34506,"36160":21464,"36161":36902,"36162":36923,"36163":38259,"36164":38084,"36165":38757,"36166":26174,"36167":39181,"36168":24778,"36169":39551,"36170":39564,"36171":39635,"36172":39633,"36173":40157,"36174":40158,"36175":40156,"36176":40502,"36177":22065,"36178":22365,"36179":25597,"36180":30251,"36181":30315,"36182":32641,"36183":34453,"36184":35753,"36185":35863,"36186":35894,"36187":33395,"36188":36195,"36189":37247,"36190":38643,"36191":28789,"36192":38701,"36193":39078,"36194":39588,"36195":39699,"36196":39751,"36197":40078,"36198":40560,"36199":40557,"36200":30839,"36201":30416,"36202":40140,"36203":40844,"36204":40843,"36205":21381,"36206":27012,"36207":28286,"36208":31729,"36209":31657,"36210":34542,"36211":35266,"36212":36433,"36213":34885,"36214":38053,"36215":39045,"36216":39307,"36217":39627,"36218":40649,"36219":28390,"36220":30633,"36221":38218,"36222":38831,"36257":39540,"36258":39589,"36259":32518,"36260":35872,"36261":36495,"36262":37245,"36263":38075,"36264":37550,"36265":38179,"36266":40132,"36267":40072,"36268":40681,"36269":20991,"36270":40550,"36271":39562,"36272":40563,"36273":40510,"36274":38074,"36275":20162,"36276":34381,"36277":27538,"36278":22439,"36279":22395,"36280":25099,"36281":20451,"36282":21037,"36283":21389,"36284":21593,"36285":21370,"36286":32424,"36287":33543,"36288":38023,"36289":38022,"36290":21591,"36291":24362,"36292":31059,"36293":32446,"36294":37071,"36295":38028,"36296":21072,"36297":21286,"36298":22261,"36299":22445,"36300":23045,"36301":23741,"36302":23811,"36303":28062,"36304":28172,"36305":28867,"36306":30502,"36307":32448,"36308":32464,"36309":33003,"36310":38030,"36311":38032,"36312":38037,"36313":38029,"36314":38379,"36315":22955,"36316":23899,"36317":24701,"36318":26720,"36319":26536,"36320":27817,"36321":27976,"36322":30066,"36323":30743,"36324":32471,"36325":33757,"36326":35271,"36327":35765,"36328":35790,"36329":35794,"36330":36150,"36331":36147,"36332":36730,"36333":36725,"36334":36728,"36335":36911,"36336":37075,"36337":37124,"36338":38059,"36339":38060,"36340":38043,"36341":38063,"36342":38061,"36343":38058,"36344":38390,"36345":38503,"36346":39032,"36347":39275,"36348":40697,"36349":20251,"36350":20603,"36416":20325,"36417":21794,"36418":22450,"36419":24047,"36420":24493,"36421":28828,"36422":33557,"36423":29426,"36424":29614,"36425":32488,"36426":32480,"36427":32481,"36428":32671,"36429":33645,"36430":34545,"36431":35795,"36432":35798,"36433":35817,"36434":35796,"36435":35804,"36436":36241,"36437":36738,"36438":36737,"36439":37036,"36440":38090,"36441":38088,"36442":38064,"36443":38066,"36444":38070,"36445":38157,"36446":38092,"36447":38077,"36448":38076,"36449":39043,"36450":39040,"36451":20971,"36452":40702,"36453":20606,"36454":21787,"36455":23901,"36456":24123,"36457":24747,"36458":24749,"36459":24580,"36460":25132,"36461":25111,"36462":25247,"36463":25248,"36464":25532,"36465":26724,"36466":26473,"36467":33637,"36468":27986,"36469":27812,"36470":28829,"36471":30386,"36472":30720,"36473":32507,"36474":32498,"36475":32495,"36476":32506,"36477":33715,"36478":35275,"36513":35830,"36514":36167,"36515":38129,"36516":38098,"36517":38097,"36518":38101,"36519":38111,"36520":38123,"36521":38127,"36522":38122,"36523":38135,"36524":38102,"36525":38117,"36526":39121,"36527":21055,"36528":21154,"36529":21715,"36530":21586,"36531":23810,"36532":23780,"36533":24209,"36534":24870,"36535":25378,"36536":26912,"36537":27637,"36538":39053,"36539":28061,"36540":28514,"36541":28064,"36542":28375,"36543":29711,"36544":29825,"36545":30231,"36546":32515,"36547":32535,"36548":32524,"36549":32527,"36550":32529,"36551":33628,"36552":33932,"36553":33553,"36554":33473,"36555":35833,"36556":35836,"36557":35842,"36558":36181,"36559":37112,"36560":38162,"36561":38103,"36562":38141,"36563":38163,"36564":38154,"36565":38116,"36566":38150,"36567":38151,"36568":38164,"36569":38406,"36570":38403,"36571":38739,"36572":39055,"36573":39293,"36574":39541,"36575":39552,"36576":40066,"36577":40488,"36578":21714,"36579":21717,"36580":21721,"36581":23250,"36582":23748,"36583":24639,"36584":27546,"36585":27981,"36586":28904,"36587":29443,"36588":29423,"36589":30876,"36590":31405,"36591":32279,"36592":32539,"36593":33927,"36594":33640,"36595":33929,"36596":33630,"36597":33720,"36598":33431,"36599":34547,"36600":35816,"36601":35857,"36602":35860,"36603":35869,"36604":37072,"36605":38185,"36606":38188,"36672":38166,"36673":38167,"36674":38140,"36675":38171,"36676":38165,"36677":38174,"36678":38036,"36679":38415,"36680":38408,"36681":38409,"36682":38410,"36683":38412,"36684":38413,"36685":40498,"36686":40497,"36687":21724,"36688":24113,"36689":24697,"36690":25672,"36691":58305,"36692":27894,"36693":29461,"36694":29971,"36695":30213,"36696":30187,"36697":30807,"36698":31654,"36699":31578,"36700":31976,"36701":32545,"36702":32807,"36703":33631,"36704":33718,"36705":34544,"36706":35042,"36707":35279,"36708":35873,"36709":35788,"36710":35877,"36711":36292,"36712":38200,"36713":38196,"36714":38113,"36715":38198,"36716":38418,"36717":39271,"36718":40082,"36719":40085,"36720":40504,"36721":40505,"36722":40506,"36723":40832,"36724":24636,"36725":25669,"36726":25784,"36727":27898,"36728":30102,"36729":32523,"36730":32873,"36731":33641,"36732":34789,"36733":34414,"36734":35764,"36769":35881,"36770":36188,"36771":36157,"36772":36760,"36773":37021,"36774":38227,"36775":38112,"36776":38204,"36777":38223,"36778":34021,"36779":38890,"36780":39273,"36781":39568,"36782":39570,"36783":39571,"36784":38411,"36785":40105,"36786":40096,"36787":40520,"36788":40513,"36789":40518,"36790":21411,"36791":21590,"36792":22406,"36793":27104,"36794":26638,"36795":27655,"36796":27895,"36797":28486,"36798":31074,"36799":32562,"36800":32563,"36801":32628,"36802":33315,"36803":34511,"36804":34431,"36805":35043,"36806":35281,"36807":35311,"36808":35886,"36809":38235,"36810":38239,"36811":38250,"36812":38214,"36813":38121,"36814":38891,"36815":39073,"36816":39312,"36817":39618,"36818":40117,"36819":40118,"36820":40123,"36821":40113,"36822":40526,"36823":40491,"36824":40700,"36825":21950,"36826":25732,"36827":26634,"36828":26533,"36829":26636,"36830":32561,"36831":32845,"36832":33551,"36833":33480,"36834":34162,"36835":34548,"36836":34686,"36837":38132,"36838":38246,"36839":38248,"36840":38241,"36841":38243,"36842":38212,"36843":38251,"36844":38119,"36845":38244,"36846":38137,"36847":38426,"36848":39071,"36849":39316,"36850":39546,"36851":39581,"36852":39583,"36853":39576,"36854":40535,"36855":40538,"36856":40540,"36857":40838,"36858":40837,"36859":20649,"36860":23743,"36861":30152,"36862":25786,"36928":27017,"36929":28384,"36930":30779,"36931":31901,"36932":32425,"36933":32556,"36934":34105,"36935":36166,"36936":38257,"36937":38396,"36938":39129,"36939":39586,"36940":39574,"36941":39580,"36942":40101,"36943":40142,"36944":40144,"36945":40547,"36946":40536,"36947":40574,"36948":20865,"36949":23048,"36950":28757,"36951":25874,"36952":30271,"36953":31656,"36954":31860,"36955":33339,"36956":35276,"36957":36345,"36958":36318,"36959":36729,"36960":38228,"36961":38252,"36962":39587,"36963":39557,"36964":40149,"36965":40099,"36966":40102,"36967":40552,"36968":40503,"36969":40859,"36970":26686,"36971":26916,"36972":34016,"36973":38624,"36974":36723,"36975":40159,"36976":40095,"36977":40553,"36978":40556,"36979":40554,"36980":40555,"36981":40519,"36982":28751,"36983":31766,"36984":35888,"36985":39628,"36986":31550,"36987":31900,"36988":32565,"36989":33044,"36990":36479,"37025":38247,"37026":40090,"37027":36273,"37028":36508,"37029":37246,"37030":35891,"37031":39070,"37032":39079,"37033":39591,"37034":40492,"37035":25094,"37036":38404,"37037":40097,"37038":40514,"37039":31160,"37040":25300,"37041":36299,"37042":29648,"37043":23467,"37044":25296,"37045":27585,"37046":20943,"37047":31108,"37048":21525,"37049":28508,"37050":34972,"37051":37095,"37052":20857,"37053":25144,"37054":25243,"37055":25383,"37056":25531,"37057":25566,"37058":25594,"37059":25745,"37060":25792,"37061":25825,"37062":25846,"37063":25861,"37064":25909,"37065":25934,"37066":25963,"37067":25992,"37068":26073,"37069":26142,"37070":26171,"37071":26175,"37072":26180,"37073":26199,"37074":26217,"37075":26227,"37076":26243,"37077":26300,"37078":26303,"37079":26305,"37080":26357,"37081":26362,"37082":26363,"37083":26382,"37084":26390,"37085":26423,"37086":26468,"37087":26470,"37088":26534,"37089":26535,"37090":26537,"37091":26619,"37092":26621,"37093":26624,"37094":26625,"37095":26629,"37096":26654,"37097":26698,"37098":26706,"37099":26709,"37100":26713,"37101":26765,"37102":26809,"37103":26831,"37104":20616,"37105":38184,"37106":40087,"37107":26914,"37108":26918,"37109":220,"37110":58591,"37111":58592,"37112":252,"37113":58594,"37114":58595,"37115":220,"37116":252,"37117":26934,"37118":26977,"37184":33477,"37185":33482,"37186":33496,"37187":33560,"37188":33562,"37189":33571,"37190":33606,"37191":33627,"37192":33634,"37193":33644,"37194":33646,"37195":33692,"37196":33695,"37197":33717,"37198":33724,"37199":33783,"37200":33834,"37201":33864,"37202":33884,"37203":33890,"37204":33924,"37205":33928,"37206":34012,"37207":34019,"37208":34104,"37209":34138,"37210":34199,"37211":34219,"37212":34241,"37213":34323,"37214":34326,"37215":8715,"37216":34581,"37217":34672,"37218":34685,"37219":34699,"37220":34728,"37221":34759,"37222":34768,"37223":34823,"37224":34830,"37225":34855,"37226":34990,"37227":8712,"37228":34997,"37229":35007,"37230":35045,"37231":35061,"37232":35100,"37233":35101,"37234":35191,"37235":35303,"37236":35383,"37237":35500,"37238":35546,"37239":35675,"37240":35697,"37241":35883,"37242":35898,"37243":35964,"37244":35982,"37245":36014,"37246":36114,"37281":36169,"37282":36173,"37283":36209,"37284":36360,"37285":36410,"37286":36464,"37287":36505,"37288":36528,"37289":36529,"37290":36549,"37291":36550,"37292":36558,"37293":36579,"37294":36620,"37295":36721,"37296":36727,"37297":36775,"37298":36847,"37299":36878,"37300":36921,"37301":36965,"37302":37001,"37303":37086,"37304":37141,"37305":37334,"37306":37339,"37307":37342,"37308":37345,"37309":37349,"37310":37366,"37311":37372,"37312":37417,"37313":37420,"37314":65287,"37315":37465,"37316":37495,"37317":37613,"37318":37690,"37319":58701,"37320":58702,"37321":29227,"37322":20866,"37323":20886,"37324":20023,"37325":20843,"37326":20799,"37327":58709,"37328":58710,"37329":26409,"37330":27706,"37331":21378,"37332":30098,"37333":32896,"37334":34916,"37335":19974,"37336":58718,"37337":58719,"37338":58720,"37339":11927,"37340":21241,"37341":21269,"37342":8225,"37343":58725,"37344":13316,"37345":58727,"37346":58728,"37347":58729,"37348":58730,"37349":58731,"37350":20981,"37351":58733,"37352":23662,"37353":58735,"37354":22231,"37355":20128,"37356":20907,"37357":11904,"37358":27079,"37359":58741,"37360":9550,"37361":9688,"37362":9689,"37363":9794,"37364":9654,"37365":9668,"37366":8597,"37367":8252,"37368":182,"37369":8704,"37370":8616,"37371":8596,"37372":8962,"37373":58755,"37374":58756,"37440":20124,"37441":24746,"37442":22311,"37443":22258,"37444":21307,"37445":22769,"37446":36920,"37447":38560,"37448":26628,"37449":21942,"37450":39365,"37451":35585,"37452":20870,"37453":32257,"37454":24540,"37455":27431,"37456":27572,"37457":26716,"37458":22885,"37459":31311,"37460":20206,"37461":20385,"37462":30011,"37463":28784,"37464":20250,"37465":24724,"37466":28023,"37467":32117,"37468":22730,"37469":25040,"37470":25313,"37471":27579,"37472":35226,"37473":23398,"37474":27005,"37475":21917,"37476":28167,"37477":58794,"37478":24059,"37479":38501,"37480":21223,"37481":23515,"37482":28450,"37483":38306,"37484":27475,"37485":35251,"37486":27671,"37487":24112,"37488":25135,"37489":29344,"37490":34384,"37491":26087,"37492":24613,"37493":25312,"37494":25369,"37495":34394,"37496":23777,"37497":25375,"37498":29421,"37499":37111,"37500":38911,"37501":26241,"37502":21220,"37537":35641,"37538":21306,"37539":39366,"37540":21234,"37541":58824,"37542":24452,"37543":33550,"37544":24693,"37545":25522,"37546":28179,"37547":32076,"37548":34509,"37549":36605,"37550":32153,"37551":40335,"37552":25731,"37553":30476,"37554":20537,"37555":21091,"37556":38522,"37557":22287,"37558":26908,"37559":27177,"37560":38997,"37561":39443,"37562":21427,"37563":21577,"37564":23087,"37565":35492,"37566":24195,"37567":28207,"37568":37489,"37569":21495,"37570":22269,"37571":40658,"37572":31296,"37573":30741,"37574":28168,"37575":25998,"37576":27507,"37577":21092,"37578":38609,"37579":21442,"37580":26719,"37581":24808,"37582":36059,"37583":27531,"37584":27503,"37585":20816,"37586":36766,"37587":28287,"37588":23455,"37589":20889,"37590":33294,"37591":25448,"37592":37320,"37593":23551,"37594":21454,"37595":34886,"37596":24467,"37597":28171,"37598":29539,"37599":32294,"37600":31899,"37601":20966,"37602":23558,"37603":31216,"37604":28169,"37605":28988,"37606":22888,"37607":26465,"37608":29366,"37609":20055,"37610":27972,"37611":21104,"37612":30067,"37613":32260,"37614":22732,"37615":23330,"37616":35698,"37617":37304,"37618":35302,"37619":22065,"37620":23517,"37621":23613,"37622":22259,"37623":31883,"37624":37204,"37625":31298,"37626":38543,"37627":39620,"37628":26530,"37629":25968,"37630":25454,"37696":28716,"37697":22768,"37698":25993,"37699":38745,"37700":31363,"37701":25666,"37702":32118,"37703":23554,"37704":27973,"37705":25126,"37706":36341,"37707":37549,"37708":28508,"37709":36983,"37710":36984,"37711":32330,"37712":31109,"37713":30094,"37714":22766,"37715":20105,"37716":33624,"37717":25436,"37718":25407,"37719":24035,"37720":31379,"37721":35013,"37722":20711,"37723":23652,"37724":32207,"37725":39442,"37726":22679,"37727":24974,"37728":34101,"37729":36104,"37730":33235,"37731":23646,"37732":32154,"37733":22549,"37734":23550,"37735":24111,"37736":28382,"37737":28381,"37738":25246,"37739":27810,"37740":28655,"37741":21336,"37742":22022,"37743":22243,"37744":26029,"37745":24382,"37746":36933,"37747":26172,"37748":37619,"37749":24193,"37750":24500,"37751":32884,"37752":25074,"37753":22618,"37754":36883,"37755":37444,"37756":28857,"37757":36578,"37758":20253,"37793":38651,"37794":28783,"37795":24403,"37796":20826,"37797":30423,"37798":31282,"37799":38360,"37800":24499,"37801":27602,"37802":29420,"37803":35501,"37804":23626,"37805":38627,"37806":24336,"37807":24745,"37808":33075,"37809":25309,"37810":24259,"37811":22770,"37812":26757,"37813":21338,"37814":34180,"37815":40614,"37816":32283,"37817":30330,"37818":39658,"37819":25244,"37820":27996,"37821":27996,"37822":25935,"37823":25975,"37824":20398,"37825":25173,"37826":20175,"37827":36794,"37828":22793,"37829":27497,"37830":33303,"37831":31807,"37832":21253,"37833":23453,"37834":25265,"37835":27873,"37836":32990,"37837":30770,"37838":35914,"37839":39165,"37840":22696,"37841":27598,"37842":28288,"37843":33032,"37844":40665,"37845":35379,"37846":34220,"37847":36493,"37848":19982,"37849":35465,"37850":25671,"37851":27096,"37852":35617,"37853":26332,"37854":26469,"37855":38972,"37856":20081,"37857":35239,"37858":31452,"37859":38534,"37860":26053,"37861":20001,"37862":29471,"37863":32209,"37864":28057,"37865":22593,"37866":31036,"37867":21169,"37868":25147,"37869":38666,"37870":40802,"37871":26278,"37872":27508,"37873":24651,"37874":32244,"37875":37676,"37876":28809,"37877":21172,"37878":27004,"37879":37682,"37880":28286,"37881":24357,"37882":20096,"37883":26365,"37884":22985,"37885":23437,"37886":23947,"37952":27179,"37953":26907,"37954":21936,"37955":31874,"37956":36796,"37957":27018,"37958":21682,"37959":40235,"37960":38635,"37961":26905,"37962":25539,"37963":39364,"37964":20967,"37965":26626,"37966":36795,"37967":20685,"37968":23776,"37969":26627,"37970":20970,"37971":21250,"37972":30834,"37973":30033,"37974":30048,"37975":22138,"37976":37618,"37977":22592,"37978":26622,"37979":20451,"37980":26466,"37981":31870,"37982":21249,"37983":20452,"37984":20453,"37985":20969,"37986":21498,"37987":21720,"37988":22222,"37989":22310,"37990":22327,"37991":22328,"37992":22408,"37993":22451,"37994":22442,"37995":22448,"37996":22486,"37997":22640,"37998":22713,"37999":22743,"38000":23670,"38001":23740,"38002":23749,"38003":23742,"38004":23926,"38005":24342,"38006":24634,"38007":25525,"38008":26433,"38009":26467,"38010":26529,"38011":26810,"38012":26917,"38013":26920,"38014":27258,"38049":26915,"38050":26913,"38051":27006,"38052":27009,"38053":27101,"38054":27182,"38055":27250,"38056":27423,"38057":27615,"38058":28181,"38059":29077,"38060":29927,"38061":29938,"38062":29936,"38063":29937,"38064":29944,"38065":29957,"38066":30057,"38067":30314,"38068":30836,"38069":31437,"38070":31439,"38071":31445,"38072":31443,"38073":31457,"38074":31472,"38075":31490,"38076":31763,"38077":31767,"38078":31888,"38079":31917,"38080":31936,"38081":31960,"38082":32155,"38083":32261,"38084":32359,"38085":32387,"38086":32400,"38087":33188,"38088":33373,"38089":33826,"38090":34009,"38091":34352,"38092":34475,"38093":34543,"38094":34992,"38095":35011,"38096":35012,"38097":35076,"38098":59183,"38099":36542,"38100":36552,"38101":36684,"38102":36791,"38103":36826,"38104":36903,"38105":36950,"38106":37685,"38107":37691,"38108":37817,"38109":38282,"38110":38294,"38111":38777,"38112":38790,"38113":38800,"38114":39082,"38115":39830,"38116":39831,"38117":39860,"38118":39887,"38119":39889,"38120":39890,"38121":39922,"38122":39921,"38123":39984,"38124":40007,"38125":40026,"38126":40176,"38127":40262,"38128":40292,"38129":40363,"38130":20036,"38131":21583,"38132":25368,"38133":39857,"38134":40041,"38135":40263,"38136":40293,"38137":39983,"38138":40639,"38139":20916,"38140":21610,"38141":26528,"38142":39822,"38208":37032,"38209":20914,"38210":13869,"38211":25285,"38212":21189,"38213":26545,"38214":21709,"38215":24658,"38216":21441,"38217":28913,"38218":22531,"38219":21855,"38220":37390,"38221":30528,"38222":29756,"38223":29002,"38224":28377,"38225":21472,"38226":29486,"38227":35023,"38228":30861,"38229":32675,"38230":32171,"38231":36394,"38232":37979,"38233":25452,"38234":24487,"38235":23557,"38236":32827,"38237":23791,"38238":14776,"38239":29009,"38240":36045,"38241":38894,"38242":22642,"38243":23139,"38244":32632,"38245":23895,"38246":24943,"38247":27032,"38248":32137,"38249":31918,"38250":32179,"38251":28545,"38252":23290,"38253":22715,"38254":29269,"38255":30286,"38256":36653,"38257":37561,"38258":40286,"38259":40623,"38260":32583,"38261":40388,"38262":36120,"38263":20915,"38264":34412,"38265":21668,"38266":21414,"38267":21030,"38268":26422,"38269":20001,"38270":21364,"38305":24313,"38306":21177,"38307":21647,"38308":24312,"38309":22956,"38310":24625,"38311":29248,"38312":33047,"38313":30267,"38314":24333,"38315":26187,"38316":26280,"38317":24932,"38318":25423,"38319":28895,"38320":27940,"38321":31911,"38322":31945,"38323":21465,"38324":25933,"38325":22338,"38326":29647,"38327":32966,"38328":13649,"38329":27445,"38330":30849,"38331":21452,"38332":29483,"38333":29482,"38334":29641,"38335":30026,"38336":23033,"38337":29124,"38338":29966,"38339":32220,"38340":39393,"38341":35241,"38342":28662,"38343":14935,"38344":25834,"38345":15341,"38346":27809,"38347":28284,"38348":30055,"38349":22633,"38350":22633,"38351":20996,"38352":59338,"38353":24967,"38354":25658,"38355":33263,"38356":59342,"38357":20917,"38358":20945,"38359":27769,"38360":22815,"38361":36857,"38362":39153,"38363":25911,"38364":33033,"38365":34996,"38366":14890,"38367":36525,"38368":32663,"38369":39440,"38370":32037,"38371":27336,"38372":20876,"38373":21031,"38374":59360,"38375":33050,"38376":21408,"38377":21410,"38378":27738,"38379":27703,"38380":33304,"38381":21894,"38382":24315,"38383":20937,"38384":30897,"38385":37474,"38386":21357,"38387":20931,"38388":59374,"38389":33905,"38390":35207,"38391":38765,"38392":35728,"38393":38563,"38394":24316,"38395":38583,"38396":20814,"38397":39952,"38398":26160,"38464":37461,"38465":30728,"38466":37701,"38467":37491,"38468":37737,"38469":59390,"38470":59391,"38471":59392,"38472":59393,"38473":37343,"38474":37338,"38475":30804,"38476":30822,"38477":30856,"38478":30902,"38479":30919,"38480":30930,"38481":30935,"38482":8491,"38483":8651,"38484":30948,"38485":30958,"38486":30960,"38487":30961,"38488":30965,"38489":31026,"38490":31027,"38491":31030,"38492":31064,"38493":12307,"38494":31065,"38495":31089,"38496":31102,"38497":31107,"38498":31110,"38499":31111,"38500":31121,"38501":31129,"38502":31135,"38503":31141,"38504":31202,"38505":31217,"38506":31220,"38507":31274,"38508":31290,"38509":31301,"38510":31333,"38511":31420,"38512":31426,"38513":31433,"38514":31451,"38515":31465,"38516":31486,"38517":31500,"38518":31527,"38519":31529,"38520":31554,"38521":31555,"38522":31573,"38523":31599,"38524":31666,"38525":27102,"38526":27129,"38561":37238,"38562":33114,"38563":33527,"38564":21579,"38565":33074,"38566":32957,"38567":33816,"38568":37214,"38569":37232,"38570":37260,"38571":33096,"38572":59459,"38573":17462,"38574":33113,"38575":32927,"38576":59463,"38577":21833,"38578":21537,"38579":21722,"38580":21554,"38581":21945,"38582":21652,"38583":59470,"38584":30802,"38585":30789,"38586":30796,"38587":59474,"38588":33981,"38589":33820,"38590":33476,"38591":59478,"38592":33915,"38593":35629,"38594":59481,"38595":22347,"38596":59483,"38597":59484,"38598":22341,"38599":34766,"38600":22112,"38601":21994,"38602":22139,"38603":32956,"38604":59491,"38605":30904,"38606":27148,"38607":21708,"38608":31696,"38609":31724,"38610":31738,"38611":31765,"38612":31771,"38613":31797,"38614":31812,"38615":31853,"38616":31886,"38617":31928,"38618":31939,"38619":31974,"38620":31981,"38621":31987,"38622":31989,"38623":31993,"38624":59511,"38625":31996,"38626":32139,"38627":32151,"38628":32164,"38629":32168,"38630":32205,"38631":32208,"38632":32211,"38633":32229,"38634":32253,"38635":27154,"38636":27170,"38637":27184,"38638":27190,"38639":27237,"38640":59527,"38641":59528,"38642":59529,"38643":59530,"38644":59531,"38645":59532,"38646":59533,"38647":59534,"38648":27251,"38649":27256,"38650":59537,"38651":59538,"38652":27260,"38653":27305,"38654":27306,"38720":9450,"38721":9312,"38722":9313,"38723":9314,"38724":9315,"38725":9316,"38726":9317,"38727":9318,"38728":9319,"38729":9320,"38730":9321,"38731":9322,"38732":9323,"38733":9324,"38734":9325,"38735":9326,"38736":9327,"38737":9328,"38738":9329,"38739":9330,"38740":9331,"38741":37700,"38742":37805,"38743":37830,"38744":37861,"38745":37914,"38746":37921,"38747":37950,"38748":37953,"38749":37971,"38750":37978,"38751":38042,"38752":38071,"38753":38104,"38754":38110,"38755":38131,"38756":38147,"38757":38158,"38758":38159,"38759":38168,"38760":38173,"38761":38186,"38762":38187,"38763":38207,"38764":38213,"38765":38222,"38766":38242,"38767":38245,"38768":38249,"38769":38258,"38770":38279,"38771":38297,"38772":38304,"38773":38322,"38774":38502,"38775":38557,"38776":38575,"38777":38578,"38778":38707,"38779":38715,"38780":38733,"38781":38735,"38782":38737,"38817":38741,"38818":38756,"38819":38763,"38820":38769,"38821":38802,"38822":38834,"38823":38898,"38824":38973,"38825":38996,"38826":39077,"38827":39107,"38828":39130,"38829":39150,"38830":39197,"38831":39200,"38832":39267,"38833":39296,"38834":39303,"38835":39309,"38836":39315,"38837":39317,"38838":39356,"38839":39368,"38840":39410,"38841":39606,"38842":39641,"38843":39646,"38844":39695,"38845":39753,"38846":39794,"38847":39811,"38848":39839,"38849":39867,"38850":39907,"38851":39925,"38852":39936,"38853":39940,"38854":39963,"38855":9398,"38856":9399,"38857":9400,"38858":9401,"38859":9402,"38860":9403,"38861":9404,"38862":9405,"38863":9406,"38864":9407,"38865":9408,"38866":9409,"38867":9410,"38868":9411,"38869":9412,"38870":9413,"38871":9414,"38872":9415,"38873":9416,"38874":9417,"38875":9418,"38876":9419,"38877":9420,"38878":9421,"38879":9422,"38880":9423,"38881":9424,"38882":9425,"38883":9426,"38884":9427,"38885":9428,"38886":9429,"38887":9430,"38888":9431,"38889":9432,"38890":9433,"38891":9434,"38892":9435,"38893":9436,"38894":9437,"38895":9438,"38896":9439,"38897":9440,"38898":9441,"38899":9442,"38900":9443,"38901":9444,"38902":9445,"38903":9446,"38904":9447,"38905":9448,"38906":9449,"38907":174,"38908":8482,"38909":59697,"38910":59698,"38976":40054,"38977":10122,"38978":10123,"38979":10124,"38980":10125,"38981":10126,"38982":10127,"38983":10128,"38984":10129,"38985":10130,"38986":10131,"38987":40069,"38988":40070,"38989":40071,"38990":40075,"38991":40080,"38992":40094,"38993":40110,"38994":40112,"38995":40114,"38996":40116,"38997":40122,"38998":40124,"38999":40125,"39000":40134,"39001":40135,"39002":40138,"39003":40139,"39004":40147,"39005":40152,"39006":40153,"39007":40162,"39008":40171,"39009":40172,"39010":40234,"39011":40264,"39012":40272,"39013":40314,"39014":40390,"39015":40523,"39016":40533,"39017":40539,"39018":40561,"39019":40618,"39020":40637,"39021":40644,"39022":40674,"39023":40682,"39024":40712,"39025":40715,"39026":40717,"39027":40737,"39028":40772,"39029":40785,"39030":40861,"39031":64014,"39032":64015,"39033":64017,"39034":64019,"39035":64020,"39036":64024,"39037":64031,"39038":64032,"39073":64033,"39074":64035,"39075":64036,"39076":64039,"39077":64040,"39078":64041,"39079":19972,"39080":20015,"39081":20097,"39082":20103,"39083":20131,"39084":20151,"39085":20156,"39086":20216,"39087":20264,"39088":20265,"39089":20279,"39090":20290,"39091":20293,"39092":20299,"39093":20338,"39094":20386,"39095":20400,"39096":20413,"39097":20424,"39098":20428,"39099":20464,"39100":20466,"39101":20473,"39102":20483,"39103":20488,"39104":20532,"39105":20539,"39106":20568,"39107":20582,"39108":20609,"39109":20624,"39110":20668,"39111":20688,"39112":20703,"39113":20705,"39114":20732,"39115":20749,"39116":20779,"39117":20832,"39118":20910,"39119":20920,"39120":20946,"39121":20962,"39122":20997,"39123":21044,"39124":21052,"39125":21081,"39126":21096,"39127":21113,"39128":21156,"39129":21196,"39130":21287,"39131":21314,"39132":21341,"39133":21373,"39134":21374,"39135":21445,"39136":21456,"39137":21458,"39138":21502,"39139":21613,"39140":21637,"39141":21651,"39142":21662,"39143":21689,"39144":21731,"39145":21743,"39146":21773,"39147":21784,"39148":21797,"39149":21800,"39150":21803,"39151":21831,"39152":21881,"39153":21904,"39154":21940,"39155":21953,"39156":21975,"39157":21976,"39158":22011,"39159":20404,"39160":22049,"39161":8707,"39162":22098,"39163":59852,"39164":9787,"39165":59854,"39166":59855,"39232":22109,"39233":9332,"39234":9333,"39235":9334,"39236":9335,"39237":9336,"39238":9337,"39239":9338,"39240":9339,"39241":9340,"39242":9341,"39243":9342,"39244":9343,"39245":9344,"39246":9345,"39247":9346,"39248":9347,"39249":9348,"39250":9349,"39251":9350,"39252":9351,"39253":22113,"39254":22153,"39255":22155,"39256":22174,"39257":22177,"39258":22193,"39259":22201,"39260":22207,"39261":22230,"39262":22255,"39263":22293,"39264":22301,"39265":22322,"39266":22333,"39267":22335,"39268":22339,"39269":8660,"39270":22398,"39271":22410,"39272":22413,"39273":22416,"39274":22428,"39275":22459,"39276":22462,"39277":22468,"39278":22494,"39279":22526,"39280":22546,"39281":22562,"39282":22599,"39283":22620,"39284":22623,"39285":22643,"39286":22695,"39287":22698,"39288":22704,"39289":22709,"39290":22710,"39291":22731,"39292":22736,"39293":22752,"39294":22789,"39329":22801,"39330":22921,"39331":22932,"39332":22938,"39333":22943,"39334":22960,"39335":22968,"39336":22980,"39337":23023,"39338":23024,"39339":23032,"39340":23042,"39341":23051,"39342":23053,"39343":23058,"39344":23073,"39345":23076,"39346":23079,"39347":23082,"39348":23083,"39349":23084,"39350":23101,"39351":23109,"39352":23124,"39353":23129,"39354":23137,"39355":23144,"39356":23147,"39357":23150,"39358":23153,"39359":23161,"39360":23166,"39361":23169,"39362":23170,"39363":23174,"39364":23176,"39365":23185,"39366":23193,"39367":23200,"39368":23201,"39369":23211,"39370":23235,"39371":23246,"39372":23247,"39373":23251,"39374":23268,"39375":23280,"39376":23294,"39377":23309,"39378":23313,"39379":23317,"39380":23327,"39381":23339,"39382":23361,"39383":23364,"39384":23366,"39385":23370,"39386":23375,"39387":23400,"39388":23412,"39389":23414,"39390":23420,"39391":23426,"39392":23440,"39393":9372,"39394":9373,"39395":9374,"39396":9375,"39397":9376,"39398":9377,"39399":9378,"39400":9379,"39401":9380,"39402":9381,"39403":9382,"39404":9383,"39405":9384,"39406":9385,"39407":9386,"39408":9387,"39409":9388,"39410":9389,"39411":9390,"39412":9391,"39413":9392,"39414":9393,"39415":9394,"39416":9395,"39417":9396,"39418":9397,"39419":60009,"39420":12850,"39421":12849,"39422":27307,"39488":23446,"39489":9352,"39490":9353,"39491":9354,"39492":9355,"39493":9356,"39494":9357,"39495":9358,"39496":9359,"39497":9360,"39498":9361,"39499":9362,"39500":9363,"39501":9364,"39502":9365,"39503":9366,"39504":9367,"39505":9368,"39506":9369,"39507":9370,"39508":9371,"39509":23509,"39510":23511,"39511":23587,"39512":23685,"39513":23710,"39514":23746,"39515":23824,"39516":23852,"39517":23855,"39518":23880,"39519":23894,"39520":23920,"39521":23931,"39522":23941,"39523":23972,"39524":23979,"39525":23990,"39526":24001,"39527":24023,"39528":24073,"39529":24136,"39530":24210,"39531":24253,"39532":24334,"39533":24434,"39534":24497,"39535":24514,"39536":24539,"39537":24543,"39538":24611,"39539":24702,"39540":24791,"39541":24839,"39542":24844,"39543":24857,"39544":24866,"39545":24912,"39546":24928,"39547":24961,"39548":24981,"39549":25017,"39550":25024,"39585":25039,"39586":25043,"39587":25050,"39588":25232,"39589":25393,"39590":8835,"39591":25399,"39592":25465,"39593":25483,"39594":25537,"39595":25570,"39596":25574,"39597":25595,"39598":25598,"39599":25607,"39600":25650,"39601":25656,"39602":25659,"39603":25690,"39604":25713,"39605":25724,"39606":25741,"39607":25775,"39608":25780,"39609":25782,"39610":25821,"39611":25829,"39612":25866,"39613":25873,"39614":25887,"39615":25951,"39616":25965,"39617":25990,"39618":26037,"39619":26046,"39620":26065,"39621":26068,"39622":26083,"39623":26111,"39624":26136,"39625":26147,"39626":26211,"39627":26219,"39628":26237,"39629":26245,"39630":26258,"39631":26266,"39632":26276,"39633":26285,"39634":26291,"39635":26294,"39636":26317,"39637":26318,"39638":26370,"39639":26380,"39640":26393,"39641":26436,"39642":26475,"39643":26511,"39644":26532,"39645":26559,"39646":26582,"39647":26583,"39648":8834,"39649":26637,"39650":26640,"39651":26651,"39652":26678,"39653":26695,"39654":26710,"39655":26756,"39656":26760,"39657":26813,"39658":26819,"39659":26821,"39660":26882,"39661":26883,"39662":26889,"39663":26904,"39664":26947,"39665":26950,"39666":26980,"39667":26983,"39668":26994,"39669":27013,"39670":27039,"39671":27042,"39672":27089,"39673":27093,"39674":27094,"39675":39457,"39676":39462,"39677":39471,"39678":27329,"39744":22975,"39745":27105,"39746":27139,"39747":27162,"39748":27164,"39749":27180,"39750":27181,"39751":27187,"39752":27203,"39753":27205,"39754":27212,"39755":27219,"39756":27223,"39757":27235,"39758":27252,"39759":27266,"39760":27274,"39761":27279,"39762":27289,"39763":27303,"39764":27313,"39765":27317,"39766":27326,"39767":27337,"39768":27348,"39769":27352,"39770":27382,"39771":27479,"39772":27514,"39773":27612,"39774":27676,"39775":27697,"39776":27736,"39777":27758,"39778":27765,"39779":27775,"39780":27823,"39781":27851,"39782":27871,"39783":27903,"39784":27906,"39785":27909,"39786":27910,"39787":27942,"39788":27991,"39789":27995,"39790":28017,"39791":28033,"39792":28047,"39793":28069,"39794":28081,"39795":28158,"39796":28162,"39797":28164,"39798":28175,"39799":28184,"39800":28202,"39801":28240,"39802":28249,"39803":28314,"39804":28341,"39805":28344,"39806":28379,"39841":28410,"39842":28420,"39843":28427,"39844":28428,"39845":28438,"39846":28439,"39847":28468,"39848":28477,"39849":28502,"39850":28537,"39851":28554,"39852":28573,"39853":28575,"39854":28603,"39855":28606,"39856":28627,"39857":28633,"39858":28664,"39859":28675,"39860":28747,"39861":28749,"39862":28752,"39863":28756,"39864":28764,"39865":28775,"39866":28791,"39867":28793,"39868":28811,"39869":28815,"39870":28832,"39871":28835,"39872":28837,"39873":28838,"39874":28839,"39875":28868,"39876":28876,"39877":28880,"39878":28886,"39879":618,"39880":603,"39881":230,"39882":652,"39883":593,"39884":596,"39885":650,"39886":605,"39887":601,"39888":602,"39889":604,"39890":609,"39891":7747,"39892":7753,"39893":330,"39894":7739,"39895":629,"39896":240,"39897":643,"39898":658,"39899":679,"39900":676,"39901":227,"39902":60294,"39903":60295,"39904":623,"39905":632,"39906":647,"39907":60299,"39908":199,"39909":339,"39910":594,"39911":65351,"39912":715,"39913":719,"39914":65345,"39915":65346,"39916":65348,"39917":65349,"39918":65350,"39919":65352,"39920":65353,"39921":65354,"39922":65355,"39923":65356,"39924":65357,"39925":65358,"39926":65359,"39927":65360,"39928":65362,"39929":65363,"39930":65364,"39931":65365,"39932":65366,"39933":65367,"39934":65370,"40000":28917,"40001":12832,"40002":12833,"40003":12834,"40004":12835,"40005":12836,"40006":12837,"40007":12838,"40008":12839,"40009":12840,"40010":12841,"40011":28926,"40012":28933,"40013":28957,"40014":28969,"40015":28971,"40016":28972,"40017":28979,"40018":28981,"40019":28987,"40020":28990,"40021":28992,"40022":29007,"40023":29035,"40024":29045,"40025":29047,"40026":29052,"40027":29054,"40028":29068,"40029":29070,"40030":29073,"40031":29078,"40032":29090,"40033":29091,"40034":29101,"40035":29108,"40036":29111,"40037":29114,"40038":29137,"40039":29149,"40040":29163,"40041":29184,"40042":29193,"40043":29198,"40044":29199,"40045":29206,"40046":29207,"40047":29220,"40048":23204,"40049":29230,"40050":8838,"40051":29271,"40052":29276,"40053":29332,"40054":29444,"40055":29456,"40056":29505,"40057":29556,"40058":29580,"40059":29583,"40060":29592,"40061":29596,"40062":29598,"40097":29607,"40098":29610,"40099":29653,"40100":29665,"40101":29666,"40102":29668,"40103":29670,"40104":29679,"40105":29683,"40106":8839,"40107":29689,"40108":29691,"40109":29698,"40110":29713,"40111":29714,"40112":29716,"40113":29717,"40114":29719,"40115":29721,"40116":29724,"40117":29726,"40118":29727,"40119":29751,"40120":29752,"40121":29753,"40122":29763,"40123":29765,"40124":29767,"40125":29768,"40126":29769,"40127":29779,"40128":29782,"40129":29797,"40130":29803,"40131":29804,"40132":29812,"40133":29818,"40134":29826,"40135":21378,"40136":24191,"40137":20008,"40138":24186,"40139":20886,"40140":23424,"40141":21353,"40142":11911,"40143":60436,"40144":21251,"40145":9746,"40146":33401,"40147":17553,"40148":11916,"40149":11914,"40150":20022,"40151":60444,"40152":21274,"40153":60446,"40154":60447,"40155":11925,"40156":60449,"40157":60450,"40158":9492,"40159":20058,"40160":36790,"40161":24308,"40162":20872,"40163":20101,"40164":60457,"40165":20031,"40166":60459,"40167":60460,"40168":20059,"40169":21430,"40170":36710,"40171":32415,"40172":35744,"40173":36125,"40174":40479,"40175":38376,"40176":38021,"40177":38429,"40178":25164,"40179":27701,"40180":20155,"40181":24516,"40182":28780,"40183":11950,"40184":21475,"40185":27362,"40186":39483,"40187":39484,"40188":39512,"40189":39516,"40190":39523,"40256":9742,"40257":8594,"40258":8592,"40259":8593,"40260":8595,"40261":8680,"40262":8678,"40263":8679,"40264":8681,"40265":8680,"40266":8678,"40267":8679,"40268":8681,"40269":9758,"40270":9756,"40271":9755,"40272":9759,"40273":12310,"40274":12311,"40275":9675,"40276":10005,"40277":10003,"40278":22267,"40279":9789,"40280":22813,"40281":26189,"40282":29221,"40283":10025,"40284":10017,"40285":9786,"40286":9785,"40287":60515,"40288":60516,"40289":60517,"40290":60518,"40291":60519,"40292":23672,"40293":9836,"40294":9834,"40295":23249,"40296":23479,"40297":23804,"40298":60526,"40299":9993,"40300":9986,"40301":60529,"40302":60530,"40303":60531,"40304":60532,"40305":23765,"40306":26478,"40307":29793,"40308":29853,"40309":32595,"40310":34195,"40311":10063,"40312":60540,"40313":60541,"40314":23928,"40315":24379,"40316":60544,"40317":9473,"40318":9475,"40353":60547,"40354":60548,"40355":60549,"40356":60550,"40357":60551,"40358":60552,"40359":60553,"40360":60554,"40361":60555,"40362":60556,"40363":60557,"40364":60558,"40365":60559,"40366":60560,"40367":60561,"40368":39602,"40369":39648,"40370":39700,"40371":39732,"40372":39737,"40373":39744,"40374":39760,"40375":39807,"40376":9788,"40377":32149,"40378":9729,"40379":38708,"40380":9730,"40381":60575,"40382":60576,"40383":60577,"40384":9992,"40385":60579,"40386":60580,"40387":60581,"40388":60582,"40389":60583,"40390":60584,"40391":60585,"40392":8507,"40393":8481,"40394":26343,"40395":28247,"40396":60590,"40397":29015,"40398":31178,"40399":8470,"40400":33132,"40401":35577,"40402":38998,"40403":60597,"40404":60598,"40405":9760,"40406":60600,"40407":9828,"40408":9824,"40409":9831,"40410":9827,"40411":9826,"40412":9830,"40413":9825,"40414":9829,"40415":60609,"40416":60610,"40417":27364,"40418":8478,"40419":13250,"40420":13272,"40421":13217,"40422":60616,"40423":13221,"40424":60618,"40425":60619,"40426":60620,"40427":60621,"40428":60622,"40429":9745,"40430":39809,"40431":39819,"40432":39821,"40433":39901,"40434":39913,"40435":39917,"40436":39924,"40437":39967,"40438":39968,"40439":39974,"40440":40019,"40441":40029,"40442":40059,"40443":40204,"40444":40214,"40445":8626,"40446":27397,"40512":36073,"40513":36082,"40514":36099,"40515":36113,"40516":36124,"40517":36218,"40518":36265,"40519":36288,"40520":36353,"40521":36366,"40522":36422,"40523":36456,"40524":36465,"40525":36478,"40526":36480,"40527":36534,"40528":36537,"40529":36540,"40530":36547,"40531":36580,"40532":36589,"40533":36594,"40534":36656,"40535":36673,"40536":36682,"40537":36773,"40538":36787,"40539":36792,"40540":36810,"40541":36815,"40542":36872,"40543":36915,"40544":36919,"40545":36964,"40546":36972,"40547":37289,"40548":37302,"40549":37316,"40550":37370,"40551":37384,"40552":37395,"40553":37409,"40554":37416,"40555":37419,"40556":37429,"40557":37436,"40558":37441,"40559":37464,"40560":37469,"40561":37471,"40562":37483,"40563":37486,"40564":37505,"40565":37508,"40566":37513,"40567":37519,"40568":37553,"40569":37562,"40570":37567,"40571":37588,"40572":37595,"40573":37603,"40574":37605,"40609":37611,"40610":37612,"40611":37620,"40612":37622,"40613":37629,"40614":37635,"40615":37639,"40616":37680,"40617":37681,"40618":37696,"40619":37698,"40620":37699,"40621":37727,"40622":37730,"40623":37734,"40624":37736,"40625":37747,"40626":37748,"40627":37752,"40628":37757,"40629":37761,"40630":37764,"40631":37766,"40632":37767,"40633":37776,"40634":37788,"40635":37792,"40636":37816,"40637":37819,"40638":37821,"40639":37823,"40640":37835,"40641":37843,"40642":37851,"40643":37856,"40644":37872,"40645":37873,"40646":37875,"40647":37876,"40648":37889,"40649":37892,"40650":37896,"40651":37911,"40652":37915,"40653":37917,"40654":37924,"40655":37925,"40656":37926,"40657":37933,"40658":37954,"40659":37955,"40660":37965,"40661":37972,"40662":37976,"40663":37989,"40664":37991,"40665":37996,"40666":38009,"40667":38011,"40668":38264,"40669":38277,"40670":38310,"40671":38314,"40672":38486,"40673":38523,"40674":38565,"40675":38644,"40676":38683,"40677":38710,"40678":38720,"40679":38721,"40680":38743,"40681":38791,"40682":38793,"40683":38811,"40684":38833,"40685":38845,"40686":38848,"40687":38850,"40688":38866,"40689":38880,"40690":38932,"40691":38933,"40692":38947,"40693":38963,"40694":39016,"40695":39095,"40696":39097,"40697":39111,"40698":39114,"40699":39136,"40700":39137,"40701":39148,"40702":39157,"40768":40225,"40769":40244,"40770":40249,"40771":40265,"40772":40270,"40773":40301,"40774":8759,"40775":40302,"40776":40316,"40777":40323,"40778":40339,"40779":40357,"40780":8748,"40781":40381,"40782":27521,"40783":27569,"40784":40015,"40785":40592,"40786":40384,"40787":60817,"40788":60818,"40789":9775,"40790":9776,"40791":9783,"40792":9779,"40793":9780,"40794":9781,"40795":9778,"40796":9782,"40797":9777,"40798":40393,"40799":40404,"40800":40444,"40801":40458,"40802":40460,"40803":40462,"40804":40472,"40805":40571,"40806":40581,"40807":40610,"40808":40620,"40809":40625,"40810":40641,"40811":40646,"40812":40647,"40813":40689,"40814":40696,"40815":40743,"40816":39182,"40817":39193,"40818":39196,"40819":39223,"40820":39261,"40821":39266,"40822":39323,"40823":39332,"40824":39338,"40825":39352,"40826":39392,"40827":39398,"40828":39413,"40829":39455,"40830":32254,"40865":32263,"40866":32347,"40867":32357,"40868":32364,"40869":32567,"40870":32576,"40871":32577,"40872":32585,"40873":32594,"40874":32655,"40875":32659,"40876":32692,"40877":32733,"40878":32743,"40879":32762,"40880":32770,"40881":32776,"40882":32814,"40883":32815,"40884":32828,"40885":32935,"40886":33036,"40887":33066,"40888":33076,"40889":33090,"40890":33110,"40891":33156,"40892":33189,"40893":33252,"40894":33364,"40895":33381,"40896":33403,"40897":33415,"40898":33471,"40899":33506,"40900":33518,"40901":33528,"40902":33532,"40903":33535,"40904":33547,"40905":33565,"40906":33597,"40907":33623,"40908":33681,"40909":33708,"40910":33741,"40911":33773,"40912":33797,"40913":33812,"40914":33814,"40915":33825,"40916":33838,"40917":33854,"40918":33866,"40919":33875,"40920":33877,"40921":33880,"40922":33892,"40923":33906,"40924":33919,"40925":33920,"40926":33938,"40927":33939,"40928":33942,"40929":33955,"40930":33982,"40931":34014,"40932":34017,"40933":34018,"40934":34020,"40935":34040,"40936":34051,"40937":34053,"40938":34064,"40939":34099,"40940":8208,"40941":34114,"40942":34124,"40943":34130,"40944":34143,"40945":34159,"40946":34160,"40947":34163,"40948":34262,"40949":34272,"40950":34286,"40951":34300,"40952":34317,"40953":34319,"40954":34324,"40955":34344,"40956":34370,"40957":34373,"40958":34418,"41024":34972,"41025":23405,"41026":33079,"41027":60958,"41028":39224,"41029":21874,"41030":21867,"41031":60962,"41032":13774,"41033":21873,"41034":21946,"41035":22001,"41036":13778,"41037":22000,"41038":22021,"41039":22050,"41040":22061,"41041":22083,"41042":22046,"41043":22162,"41044":31949,"41045":21530,"41046":21523,"41047":21655,"41048":26353,"41049":30004,"41050":21581,"41051":22180,"41052":22175,"41053":25811,"41054":25390,"41055":25592,"41056":25886,"41057":20088,"41058":27626,"41059":27698,"41060":27709,"41061":27746,"41062":27826,"41063":28152,"41064":28201,"41065":28278,"41066":28290,"41067":28294,"41068":28347,"41069":28383,"41070":28386,"41071":28433,"41072":28452,"41073":28532,"41074":28561,"41075":28597,"41076":28659,"41077":28661,"41078":28859,"41079":28864,"41080":28943,"41081":8706,"41082":29013,"41083":29043,"41084":29050,"41085":61016,"41086":21027,"41121":61018,"41122":13393,"41123":61020,"41124":36812,"41125":61022,"41126":61023,"41127":192,"41128":200,"41129":204,"41130":210,"41131":217,"41132":193,"41133":205,"41134":211,"41135":218,"41136":257,"41137":275,"41138":299,"41139":333,"41140":363,"41141":470,"41142":196,"41143":203,"41144":207,"41145":214,"41146":220,"41147":198,"41148":199,"41149":209,"41150":195,"41151":213,"41152":225,"41153":233,"41154":237,"41155":243,"41156":250,"41157":472,"41158":228,"41159":235,"41160":239,"41161":246,"41162":252,"41163":230,"41164":231,"41165":241,"41166":227,"41167":245,"41168":462,"41169":283,"41170":464,"41171":466,"41172":468,"41173":474,"41174":197,"41175":201,"41176":29064,"41177":216,"41178":208,"41179":7922,"41180":222,"41181":223,"41182":170,"41183":161,"41184":224,"41185":232,"41186":236,"41187":242,"41188":249,"41189":476,"41190":229,"41191":29080,"41192":29143,"41193":248,"41194":240,"41195":7923,"41196":254,"41197":255,"41198":186,"41199":191,"41200":226,"41201":234,"41202":238,"41203":244,"41204":251,"41205":29173,"41206":194,"41207":202,"41208":206,"41209":212,"41210":219,"41211":184,"41212":164,"41213":61110,"41214":402,"41280":12288,"41281":65292,"41282":12289,"41283":12290,"41284":65294,"41285":8231,"41286":65307,"41287":65306,"41288":65311,"41289":65281,"41290":65072,"41291":8230,"41292":8229,"41293":65104,"41294":65105,"41295":65106,"41296":183,"41297":65108,"41298":65109,"41299":65110,"41300":65111,"41301":65372,"41302":8211,"41303":65073,"41304":8212,"41305":65075,"41306":9588,"41307":65076,"41308":65103,"41309":65288,"41310":65289,"41311":65077,"41312":65078,"41313":65371,"41314":65373,"41315":65079,"41316":65080,"41317":12308,"41318":12309,"41319":65081,"41320":65082,"41321":12304,"41322":12305,"41323":65083,"41324":65084,"41325":12298,"41326":12299,"41327":65085,"41328":65086,"41329":12296,"41330":12297,"41331":65087,"41332":65088,"41333":12300,"41334":12301,"41335":65089,"41336":65090,"41337":12302,"41338":12303,"41339":65091,"41340":65092,"41341":65113,"41342":65114,"41377":65115,"41378":65116,"41379":65117,"41380":65118,"41381":8216,"41382":8217,"41383":8220,"41384":8221,"41385":12317,"41386":12318,"41387":8245,"41388":8242,"41389":65283,"41390":65286,"41391":65290,"41392":8251,"41393":167,"41394":12291,"41395":9675,"41396":9679,"41397":9651,"41398":9650,"41399":9678,"41400":9734,"41401":9733,"41402":9671,"41403":9670,"41404":9633,"41405":9632,"41406":9661,"41407":9660,"41408":12963,"41409":8453,"41410":175,"41411":65507,"41412":65343,"41413":717,"41414":65097,"41415":65098,"41416":65101,"41417":65102,"41418":65099,"41419":65100,"41420":65119,"41421":65120,"41422":65121,"41423":65291,"41424":65293,"41425":215,"41426":247,"41427":177,"41428":8730,"41429":65308,"41430":65310,"41431":65309,"41432":8806,"41433":8807,"41434":8800,"41435":8734,"41436":8786,"41437":8801,"41438":65122,"41439":65123,"41440":65124,"41441":65125,"41442":65126,"41443":65374,"41444":8745,"41445":8746,"41446":8869,"41447":8736,"41448":8735,"41449":8895,"41450":13266,"41451":13265,"41452":8747,"41453":8750,"41454":8757,"41455":8756,"41456":9792,"41457":9794,"41458":8853,"41459":8857,"41460":8593,"41461":8595,"41462":8592,"41463":8594,"41464":8598,"41465":8599,"41466":8601,"41467":8600,"41468":8741,"41469":8739,"41470":65295,"41536":65340,"41537":8725,"41538":65128,"41539":65284,"41540":65509,"41541":12306,"41542":65504,"41543":65505,"41544":65285,"41545":65312,"41546":8451,"41547":8457,"41548":65129,"41549":65130,"41550":65131,"41551":13269,"41552":13212,"41553":13213,"41554":13214,"41555":13262,"41556":13217,"41557":13198,"41558":13199,"41559":13252,"41560":176,"41561":20825,"41562":20827,"41563":20830,"41564":20829,"41565":20833,"41566":20835,"41567":21991,"41568":29929,"41569":31950,"41570":9601,"41571":9602,"41572":9603,"41573":9604,"41574":9605,"41575":9606,"41576":9607,"41577":9608,"41578":9615,"41579":9614,"41580":9613,"41581":9612,"41582":9611,"41583":9610,"41584":9609,"41585":9532,"41586":9524,"41587":9516,"41588":9508,"41589":9500,"41590":9620,"41591":9472,"41592":9474,"41593":9621,"41594":9484,"41595":9488,"41596":9492,"41597":9496,"41598":9581,"41633":9582,"41634":9584,"41635":9583,"41636":9552,"41637":9566,"41638":9578,"41639":9569,"41640":9698,"41641":9699,"41642":9701,"41643":9700,"41644":9585,"41645":9586,"41646":9587,"41647":65296,"41648":65297,"41649":65298,"41650":65299,"41651":65300,"41652":65301,"41653":65302,"41654":65303,"41655":65304,"41656":65305,"41657":8544,"41658":8545,"41659":8546,"41660":8547,"41661":8548,"41662":8549,"41663":8550,"41664":8551,"41665":8552,"41666":8553,"41667":12321,"41668":12322,"41669":12323,"41670":12324,"41671":12325,"41672":12326,"41673":12327,"41674":12328,"41675":12329,"41676":21313,"41677":21316,"41678":21317,"41679":65313,"41680":65314,"41681":65315,"41682":65316,"41683":65317,"41684":65318,"41685":65319,"41686":65320,"41687":65321,"41688":65322,"41689":65323,"41690":65324,"41691":65325,"41692":65326,"41693":65327,"41694":65328,"41695":65329,"41696":65330,"41697":65331,"41698":65332,"41699":65333,"41700":65334,"41701":65335,"41702":65336,"41703":65337,"41704":65338,"41705":65345,"41706":65346,"41707":65347,"41708":65348,"41709":65349,"41710":65350,"41711":65351,"41712":65352,"41713":65353,"41714":65354,"41715":65355,"41716":65356,"41717":65357,"41718":65358,"41719":65359,"41720":65360,"41721":65361,"41722":65362,"41723":65363,"41724":65364,"41725":65365,"41726":65366,"41792":65367,"41793":65368,"41794":65369,"41795":65370,"41796":913,"41797":914,"41798":915,"41799":916,"41800":917,"41801":918,"41802":919,"41803":920,"41804":921,"41805":922,"41806":923,"41807":924,"41808":925,"41809":926,"41810":927,"41811":928,"41812":929,"41813":931,"41814":932,"41815":933,"41816":934,"41817":935,"41818":936,"41819":937,"41820":945,"41821":946,"41822":947,"41823":948,"41824":949,"41825":950,"41826":951,"41827":952,"41828":953,"41829":954,"41830":955,"41831":956,"41832":957,"41833":958,"41834":959,"41835":960,"41836":961,"41837":963,"41838":964,"41839":965,"41840":966,"41841":967,"41842":968,"41843":969,"41844":12549,"41845":12550,"41846":12551,"41847":12552,"41848":12553,"41849":12554,"41850":12555,"41851":12556,"41852":12557,"41853":12558,"41854":12559,"41889":12560,"41890":12561,"41891":12562,"41892":12563,"41893":12564,"41894":12565,"41895":12566,"41896":12567,"41897":12568,"41898":12569,"41899":12570,"41900":12571,"41901":12572,"41902":12573,"41903":12574,"41904":12575,"41905":12576,"41906":12577,"41907":12578,"41908":12579,"41909":12580,"41910":12581,"41911":12582,"41912":12583,"41913":12584,"41914":12585,"41915":729,"41916":713,"41917":714,"41918":711,"41919":715,"41920":9216,"41921":9217,"41922":9218,"41923":9219,"41924":9220,"41925":9221,"41926":9222,"41927":9223,"41928":9224,"41929":9225,"41930":9226,"41931":9227,"41932":9228,"41933":9229,"41934":9230,"41935":9231,"41936":9232,"41937":9233,"41938":9234,"41939":9235,"41940":9236,"41941":9237,"41942":9238,"41943":9239,"41944":9240,"41945":9241,"41946":9242,"41947":9243,"41948":9244,"41949":9245,"41950":9246,"41951":9247,"41952":9249,"41953":8364,"41954":63561,"41955":63562,"41956":63563,"41957":63564,"41958":63565,"41959":63566,"41960":63567,"41961":63568,"41962":63569,"41963":63570,"41964":63571,"41965":63572,"41966":63573,"41967":63574,"41968":63575,"41969":63576,"41970":63577,"41971":63578,"41972":63579,"41973":63580,"41974":63581,"41975":63582,"41976":63583,"41977":63584,"41978":63585,"41979":63586,"41980":63587,"41981":63588,"41982":63589,"42048":19968,"42049":20057,"42050":19969,"42051":19971,"42052":20035,"42053":20061,"42054":20102,"42055":20108,"42056":20154,"42057":20799,"42058":20837,"42059":20843,"42060":20960,"42061":20992,"42062":20993,"42063":21147,"42064":21269,"42065":21313,"42066":21340,"42067":21448,"42068":19977,"42069":19979,"42070":19976,"42071":19978,"42072":20011,"42073":20024,"42074":20961,"42075":20037,"42076":20040,"42077":20063,"42078":20062,"42079":20110,"42080":20129,"42081":20800,"42082":20995,"42083":21242,"42084":21315,"42085":21449,"42086":21475,"42087":22303,"42088":22763,"42089":22805,"42090":22823,"42091":22899,"42092":23376,"42093":23377,"42094":23379,"42095":23544,"42096":23567,"42097":23586,"42098":23608,"42099":23665,"42100":24029,"42101":24037,"42102":24049,"42103":24050,"42104":24051,"42105":24062,"42106":24178,"42107":24318,"42108":24331,"42109":24339,"42110":25165,"42145":19985,"42146":19984,"42147":19981,"42148":20013,"42149":20016,"42150":20025,"42151":20043,"42152":23609,"42153":20104,"42154":20113,"42155":20117,"42156":20114,"42157":20116,"42158":20130,"42159":20161,"42160":20160,"42161":20163,"42162":20166,"42163":20167,"42164":20173,"42165":20170,"42166":20171,"42167":20164,"42168":20803,"42169":20801,"42170":20839,"42171":20845,"42172":20846,"42173":20844,"42174":20887,"42175":20982,"42176":20998,"42177":20999,"42178":21000,"42179":21243,"42180":21246,"42181":21247,"42182":21270,"42183":21305,"42184":21320,"42185":21319,"42186":21317,"42187":21342,"42188":21380,"42189":21451,"42190":21450,"42191":21453,"42192":22764,"42193":22825,"42194":22827,"42195":22826,"42196":22829,"42197":23380,"42198":23569,"42199":23588,"42200":23610,"42201":23663,"42202":24052,"42203":24187,"42204":24319,"42205":24340,"42206":24341,"42207":24515,"42208":25096,"42209":25142,"42210":25163,"42211":25166,"42212":25903,"42213":25991,"42214":26007,"42215":26020,"42216":26041,"42217":26085,"42218":26352,"42219":26376,"42220":26408,"42221":27424,"42222":27490,"42223":27513,"42224":27595,"42225":27604,"42226":27611,"42227":27663,"42228":27700,"42229":28779,"42230":29226,"42231":29238,"42232":29243,"42233":29255,"42234":29273,"42235":29275,"42236":29356,"42237":29579,"42238":19993,"42304":19990,"42305":19989,"42306":19988,"42307":19992,"42308":20027,"42309":20045,"42310":20047,"42311":20046,"42312":20197,"42313":20184,"42314":20180,"42315":20181,"42316":20182,"42317":20183,"42318":20195,"42319":20196,"42320":20185,"42321":20190,"42322":20805,"42323":20804,"42324":20873,"42325":20874,"42326":20908,"42327":20985,"42328":20986,"42329":20984,"42330":21002,"42331":21152,"42332":21151,"42333":21253,"42334":21254,"42335":21271,"42336":21277,"42337":20191,"42338":21322,"42339":21321,"42340":21345,"42341":21344,"42342":21359,"42343":21358,"42344":21435,"42345":21487,"42346":21476,"42347":21491,"42348":21484,"42349":21486,"42350":21481,"42351":21480,"42352":21500,"42353":21496,"42354":21493,"42355":21483,"42356":21478,"42357":21482,"42358":21490,"42359":21489,"42360":21488,"42361":21477,"42362":21485,"42363":21499,"42364":22235,"42365":22234,"42366":22806,"42401":22830,"42402":22833,"42403":22900,"42404":22902,"42405":23381,"42406":23427,"42407":23612,"42408":24040,"42409":24039,"42410":24038,"42411":24066,"42412":24067,"42413":24179,"42414":24188,"42415":24321,"42416":24344,"42417":24343,"42418":24517,"42419":25098,"42420":25171,"42421":25172,"42422":25170,"42423":25169,"42424":26021,"42425":26086,"42426":26414,"42427":26412,"42428":26410,"42429":26411,"42430":26413,"42431":27491,"42432":27597,"42433":27665,"42434":27664,"42435":27704,"42436":27713,"42437":27712,"42438":27710,"42439":29359,"42440":29572,"42441":29577,"42442":29916,"42443":29926,"42444":29976,"42445":29983,"42446":29992,"42447":29993,"42448":30000,"42449":30001,"42450":30002,"42451":30003,"42452":30091,"42453":30333,"42454":30382,"42455":30399,"42456":30446,"42457":30683,"42458":30690,"42459":30707,"42460":31034,"42461":31166,"42462":31348,"42463":31435,"42464":19998,"42465":19999,"42466":20050,"42467":20051,"42468":20073,"42469":20121,"42470":20132,"42471":20134,"42472":20133,"42473":20223,"42474":20233,"42475":20249,"42476":20234,"42477":20245,"42478":20237,"42479":20240,"42480":20241,"42481":20239,"42482":20210,"42483":20214,"42484":20219,"42485":20208,"42486":20211,"42487":20221,"42488":20225,"42489":20235,"42490":20809,"42491":20807,"42492":20806,"42493":20808,"42494":20840,"42560":20849,"42561":20877,"42562":20912,"42563":21015,"42564":21009,"42565":21010,"42566":21006,"42567":21014,"42568":21155,"42569":21256,"42570":21281,"42571":21280,"42572":21360,"42573":21361,"42574":21513,"42575":21519,"42576":21516,"42577":21514,"42578":21520,"42579":21505,"42580":21515,"42581":21508,"42582":21521,"42583":21517,"42584":21512,"42585":21507,"42586":21518,"42587":21510,"42588":21522,"42589":22240,"42590":22238,"42591":22237,"42592":22323,"42593":22320,"42594":22312,"42595":22317,"42596":22316,"42597":22319,"42598":22313,"42599":22809,"42600":22810,"42601":22839,"42602":22840,"42603":22916,"42604":22904,"42605":22915,"42606":22909,"42607":22905,"42608":22914,"42609":22913,"42610":23383,"42611":23384,"42612":23431,"42613":23432,"42614":23429,"42615":23433,"42616":23546,"42617":23574,"42618":23673,"42619":24030,"42620":24070,"42621":24182,"42622":24180,"42657":24335,"42658":24347,"42659":24537,"42660":24534,"42661":25102,"42662":25100,"42663":25101,"42664":25104,"42665":25187,"42666":25179,"42667":25176,"42668":25910,"42669":26089,"42670":26088,"42671":26092,"42672":26093,"42673":26354,"42674":26355,"42675":26377,"42676":26429,"42677":26420,"42678":26417,"42679":26421,"42680":27425,"42681":27492,"42682":27515,"42683":27670,"42684":27741,"42685":27735,"42686":27737,"42687":27743,"42688":27744,"42689":27728,"42690":27733,"42691":27745,"42692":27739,"42693":27725,"42694":27726,"42695":28784,"42696":29279,"42697":29277,"42698":30334,"42699":31481,"42700":31859,"42701":31992,"42702":32566,"42703":32650,"42704":32701,"42705":32769,"42706":32771,"42707":32780,"42708":32786,"42709":32819,"42710":32895,"42711":32905,"42712":32907,"42713":32908,"42714":33251,"42715":33258,"42716":33267,"42717":33276,"42718":33292,"42719":33307,"42720":33311,"42721":33390,"42722":33394,"42723":33406,"42724":34411,"42725":34880,"42726":34892,"42727":34915,"42728":35199,"42729":38433,"42730":20018,"42731":20136,"42732":20301,"42733":20303,"42734":20295,"42735":20311,"42736":20318,"42737":20276,"42738":20315,"42739":20309,"42740":20272,"42741":20304,"42742":20305,"42743":20285,"42744":20282,"42745":20280,"42746":20291,"42747":20308,"42748":20284,"42749":20294,"42750":20323,"42816":20316,"42817":20320,"42818":20271,"42819":20302,"42820":20278,"42821":20313,"42822":20317,"42823":20296,"42824":20314,"42825":20812,"42826":20811,"42827":20813,"42828":20853,"42829":20918,"42830":20919,"42831":21029,"42832":21028,"42833":21033,"42834":21034,"42835":21032,"42836":21163,"42837":21161,"42838":21162,"42839":21164,"42840":21283,"42841":21363,"42842":21365,"42843":21533,"42844":21549,"42845":21534,"42846":21566,"42847":21542,"42848":21582,"42849":21543,"42850":21574,"42851":21571,"42852":21555,"42853":21576,"42854":21570,"42855":21531,"42856":21545,"42857":21578,"42858":21561,"42859":21563,"42860":21560,"42861":21550,"42862":21557,"42863":21558,"42864":21536,"42865":21564,"42866":21568,"42867":21553,"42868":21547,"42869":21535,"42870":21548,"42871":22250,"42872":22256,"42873":22244,"42874":22251,"42875":22346,"42876":22353,"42877":22336,"42878":22349,"42913":22343,"42914":22350,"42915":22334,"42916":22352,"42917":22351,"42918":22331,"42919":22767,"42920":22846,"42921":22941,"42922":22930,"42923":22952,"42924":22942,"42925":22947,"42926":22937,"42927":22934,"42928":22925,"42929":22948,"42930":22931,"42931":22922,"42932":22949,"42933":23389,"42934":23388,"42935":23386,"42936":23387,"42937":23436,"42938":23435,"42939":23439,"42940":23596,"42941":23616,"42942":23617,"42943":23615,"42944":23614,"42945":23696,"42946":23697,"42947":23700,"42948":23692,"42949":24043,"42950":24076,"42951":24207,"42952":24199,"42953":24202,"42954":24311,"42955":24324,"42956":24351,"42957":24420,"42958":24418,"42959":24439,"42960":24441,"42961":24536,"42962":24524,"42963":24535,"42964":24525,"42965":24561,"42966":24555,"42967":24568,"42968":24554,"42969":25106,"42970":25105,"42971":25220,"42972":25239,"42973":25238,"42974":25216,"42975":25206,"42976":25225,"42977":25197,"42978":25226,"42979":25212,"42980":25214,"42981":25209,"42982":25203,"42983":25234,"42984":25199,"42985":25240,"42986":25198,"42987":25237,"42988":25235,"42989":25233,"42990":25222,"42991":25913,"42992":25915,"42993":25912,"42994":26097,"42995":26356,"42996":26463,"42997":26446,"42998":26447,"42999":26448,"43000":26449,"43001":26460,"43002":26454,"43003":26462,"43004":26441,"43005":26438,"43006":26464,"43072":26451,"43073":26455,"43074":27493,"43075":27599,"43076":27714,"43077":27742,"43078":27801,"43079":27777,"43080":27784,"43081":27785,"43082":27781,"43083":27803,"43084":27754,"43085":27770,"43086":27792,"43087":27760,"43088":27788,"43089":27752,"43090":27798,"43091":27794,"43092":27773,"43093":27779,"43094":27762,"43095":27774,"43096":27764,"43097":27782,"43098":27766,"43099":27789,"43100":27796,"43101":27800,"43102":27778,"43103":28790,"43104":28796,"43105":28797,"43106":28792,"43107":29282,"43108":29281,"43109":29280,"43110":29380,"43111":29378,"43112":29590,"43113":29996,"43114":29995,"43115":30007,"43116":30008,"43117":30338,"43118":30447,"43119":30691,"43120":31169,"43121":31168,"43122":31167,"43123":31350,"43124":31995,"43125":32597,"43126":32918,"43127":32915,"43128":32925,"43129":32920,"43130":32923,"43131":32922,"43132":32946,"43133":33391,"43134":33426,"43169":33419,"43170":33421,"43171":35211,"43172":35282,"43173":35328,"43174":35895,"43175":35910,"43176":35925,"43177":35997,"43178":36196,"43179":36208,"43180":36275,"43181":36523,"43182":36554,"43183":36763,"43184":36784,"43185":36802,"43186":36806,"43187":36805,"43188":36804,"43189":24033,"43190":37009,"43191":37026,"43192":37034,"43193":37030,"43194":37027,"43195":37193,"43196":37318,"43197":37324,"43198":38450,"43199":38446,"43200":38449,"43201":38442,"43202":38444,"43203":20006,"43204":20054,"43205":20083,"43206":20107,"43207":20123,"43208":20126,"43209":20139,"43210":20140,"43211":20335,"43212":20381,"43213":20365,"43214":20339,"43215":20351,"43216":20332,"43217":20379,"43218":20363,"43219":20358,"43220":20355,"43221":20336,"43222":20341,"43223":20360,"43224":20329,"43225":20347,"43226":20374,"43227":20350,"43228":20367,"43229":20369,"43230":20346,"43231":20820,"43232":20818,"43233":20821,"43234":20841,"43235":20855,"43236":20854,"43237":20856,"43238":20925,"43239":20989,"43240":21051,"43241":21048,"43242":21047,"43243":21050,"43244":21040,"43245":21038,"43246":21046,"43247":21057,"43248":21182,"43249":21179,"43250":21330,"43251":21332,"43252":21331,"43253":21329,"43254":21350,"43255":21367,"43256":21368,"43257":21369,"43258":21462,"43259":21460,"43260":21463,"43261":21619,"43262":21621,"43328":21654,"43329":21624,"43330":21653,"43331":21632,"43332":21627,"43333":21623,"43334":21636,"43335":21650,"43336":21638,"43337":21628,"43338":21648,"43339":21617,"43340":21622,"43341":21644,"43342":21658,"43343":21602,"43344":21608,"43345":21643,"43346":21629,"43347":21646,"43348":22266,"43349":22403,"43350":22391,"43351":22378,"43352":22377,"43353":22369,"43354":22374,"43355":22372,"43356":22396,"43357":22812,"43358":22857,"43359":22855,"43360":22856,"43361":22852,"43362":22868,"43363":22974,"43364":22971,"43365":22996,"43366":22969,"43367":22958,"43368":22993,"43369":22982,"43370":22992,"43371":22989,"43372":22987,"43373":22995,"43374":22986,"43375":22959,"43376":22963,"43377":22994,"43378":22981,"43379":23391,"43380":23396,"43381":23395,"43382":23447,"43383":23450,"43384":23448,"43385":23452,"43386":23449,"43387":23451,"43388":23578,"43389":23624,"43390":23621,"43425":23622,"43426":23735,"43427":23713,"43428":23736,"43429":23721,"43430":23723,"43431":23729,"43432":23731,"43433":24088,"43434":24090,"43435":24086,"43436":24085,"43437":24091,"43438":24081,"43439":24184,"43440":24218,"43441":24215,"43442":24220,"43443":24213,"43444":24214,"43445":24310,"43446":24358,"43447":24359,"43448":24361,"43449":24448,"43450":24449,"43451":24447,"43452":24444,"43453":24541,"43454":24544,"43455":24573,"43456":24565,"43457":24575,"43458":24591,"43459":24596,"43460":24623,"43461":24629,"43462":24598,"43463":24618,"43464":24597,"43465":24609,"43466":24615,"43467":24617,"43468":24619,"43469":24603,"43470":25110,"43471":25109,"43472":25151,"43473":25150,"43474":25152,"43475":25215,"43476":25289,"43477":25292,"43478":25284,"43479":25279,"43480":25282,"43481":25273,"43482":25298,"43483":25307,"43484":25259,"43485":25299,"43486":25300,"43487":25291,"43488":25288,"43489":25256,"43490":25277,"43491":25276,"43492":25296,"43493":25305,"43494":25287,"43495":25293,"43496":25269,"43497":25306,"43498":25265,"43499":25304,"43500":25302,"43501":25303,"43502":25286,"43503":25260,"43504":25294,"43505":25918,"43506":26023,"43507":26044,"43508":26106,"43509":26132,"43510":26131,"43511":26124,"43512":26118,"43513":26114,"43514":26126,"43515":26112,"43516":26127,"43517":26133,"43518":26122,"43584":26119,"43585":26381,"43586":26379,"43587":26477,"43588":26507,"43589":26517,"43590":26481,"43591":26524,"43592":26483,"43593":26487,"43594":26503,"43595":26525,"43596":26519,"43597":26479,"43598":26480,"43599":26495,"43600":26505,"43601":26494,"43602":26512,"43603":26485,"43604":26522,"43605":26515,"43606":26492,"43607":26474,"43608":26482,"43609":27427,"43610":27494,"43611":27495,"43612":27519,"43613":27667,"43614":27675,"43615":27875,"43616":27880,"43617":27891,"43618":27825,"43619":27852,"43620":27877,"43621":27827,"43622":27837,"43623":27838,"43624":27836,"43625":27874,"43626":27819,"43627":27861,"43628":27859,"43629":27832,"43630":27844,"43631":27833,"43632":27841,"43633":27822,"43634":27863,"43635":27845,"43636":27889,"43637":27839,"43638":27835,"43639":27873,"43640":27867,"43641":27850,"43642":27820,"43643":27887,"43644":27868,"43645":27862,"43646":27872,"43681":28821,"43682":28814,"43683":28818,"43684":28810,"43685":28825,"43686":29228,"43687":29229,"43688":29240,"43689":29256,"43690":29287,"43691":29289,"43692":29376,"43693":29390,"43694":29401,"43695":29399,"43696":29392,"43697":29609,"43698":29608,"43699":29599,"43700":29611,"43701":29605,"43702":30013,"43703":30109,"43704":30105,"43705":30106,"43706":30340,"43707":30402,"43708":30450,"43709":30452,"43710":30693,"43711":30717,"43712":31038,"43713":31040,"43714":31041,"43715":31177,"43716":31176,"43717":31354,"43718":31353,"43719":31482,"43720":31998,"43721":32596,"43722":32652,"43723":32651,"43724":32773,"43725":32954,"43726":32933,"43727":32930,"43728":32945,"43729":32929,"43730":32939,"43731":32937,"43732":32948,"43733":32938,"43734":32943,"43735":33253,"43736":33278,"43737":33293,"43738":33459,"43739":33437,"43740":33433,"43741":33453,"43742":33469,"43743":33439,"43744":33465,"43745":33457,"43746":33452,"43747":33445,"43748":33455,"43749":33464,"43750":33443,"43751":33456,"43752":33470,"43753":33463,"43754":34382,"43755":34417,"43756":21021,"43757":34920,"43758":36555,"43759":36814,"43760":36820,"43761":36817,"43762":37045,"43763":37048,"43764":37041,"43765":37046,"43766":37319,"43767":37329,"43768":38263,"43769":38272,"43770":38428,"43771":38464,"43772":38463,"43773":38459,"43774":38468,"43840":38466,"43841":38585,"43842":38632,"43843":38738,"43844":38750,"43845":20127,"43846":20141,"43847":20142,"43848":20449,"43849":20405,"43850":20399,"43851":20415,"43852":20448,"43853":20433,"43854":20431,"43855":20445,"43856":20419,"43857":20406,"43858":20440,"43859":20447,"43860":20426,"43861":20439,"43862":20398,"43863":20432,"43864":20420,"43865":20418,"43866":20442,"43867":20430,"43868":20446,"43869":20407,"43870":20823,"43871":20882,"43872":20881,"43873":20896,"43874":21070,"43875":21059,"43876":21066,"43877":21069,"43878":21068,"43879":21067,"43880":21063,"43881":21191,"43882":21193,"43883":21187,"43884":21185,"43885":21261,"43886":21335,"43887":21371,"43888":21402,"43889":21467,"43890":21676,"43891":21696,"43892":21672,"43893":21710,"43894":21705,"43895":21688,"43896":21670,"43897":21683,"43898":21703,"43899":21698,"43900":21693,"43901":21674,"43902":21697,"43937":21700,"43938":21704,"43939":21679,"43940":21675,"43941":21681,"43942":21691,"43943":21673,"43944":21671,"43945":21695,"43946":22271,"43947":22402,"43948":22411,"43949":22432,"43950":22435,"43951":22434,"43952":22478,"43953":22446,"43954":22419,"43955":22869,"43956":22865,"43957":22863,"43958":22862,"43959":22864,"43960":23004,"43961":23000,"43962":23039,"43963":23011,"43964":23016,"43965":23043,"43966":23013,"43967":23018,"43968":23002,"43969":23014,"43970":23041,"43971":23035,"43972":23401,"43973":23459,"43974":23462,"43975":23460,"43976":23458,"43977":23461,"43978":23553,"43979":23630,"43980":23631,"43981":23629,"43982":23627,"43983":23769,"43984":23762,"43985":24055,"43986":24093,"43987":24101,"43988":24095,"43989":24189,"43990":24224,"43991":24230,"43992":24314,"43993":24328,"43994":24365,"43995":24421,"43996":24456,"43997":24453,"43998":24458,"43999":24459,"44000":24455,"44001":24460,"44002":24457,"44003":24594,"44004":24605,"44005":24608,"44006":24613,"44007":24590,"44008":24616,"44009":24653,"44010":24688,"44011":24680,"44012":24674,"44013":24646,"44014":24643,"44015":24684,"44016":24683,"44017":24682,"44018":24676,"44019":25153,"44020":25308,"44021":25366,"44022":25353,"44023":25340,"44024":25325,"44025":25345,"44026":25326,"44027":25341,"44028":25351,"44029":25329,"44030":25335,"44096":25327,"44097":25324,"44098":25342,"44099":25332,"44100":25361,"44101":25346,"44102":25919,"44103":25925,"44104":26027,"44105":26045,"44106":26082,"44107":26149,"44108":26157,"44109":26144,"44110":26151,"44111":26159,"44112":26143,"44113":26152,"44114":26161,"44115":26148,"44116":26359,"44117":26623,"44118":26579,"44119":26609,"44120":26580,"44121":26576,"44122":26604,"44123":26550,"44124":26543,"44125":26613,"44126":26601,"44127":26607,"44128":26564,"44129":26577,"44130":26548,"44131":26586,"44132":26597,"44133":26552,"44134":26575,"44135":26590,"44136":26611,"44137":26544,"44138":26585,"44139":26594,"44140":26589,"44141":26578,"44142":27498,"44143":27523,"44144":27526,"44145":27573,"44146":27602,"44147":27607,"44148":27679,"44149":27849,"44150":27915,"44151":27954,"44152":27946,"44153":27969,"44154":27941,"44155":27916,"44156":27953,"44157":27934,"44158":27927,"44193":27963,"44194":27965,"44195":27966,"44196":27958,"44197":27931,"44198":27893,"44199":27961,"44200":27943,"44201":27960,"44202":27945,"44203":27950,"44204":27957,"44205":27918,"44206":27947,"44207":28843,"44208":28858,"44209":28851,"44210":28844,"44211":28847,"44212":28845,"44213":28856,"44214":28846,"44215":28836,"44216":29232,"44217":29298,"44218":29295,"44219":29300,"44220":29417,"44221":29408,"44222":29409,"44223":29623,"44224":29642,"44225":29627,"44226":29618,"44227":29645,"44228":29632,"44229":29619,"44230":29978,"44231":29997,"44232":30031,"44233":30028,"44234":30030,"44235":30027,"44236":30123,"44237":30116,"44238":30117,"44239":30114,"44240":30115,"44241":30328,"44242":30342,"44243":30343,"44244":30344,"44245":30408,"44246":30406,"44247":30403,"44248":30405,"44249":30465,"44250":30457,"44251":30456,"44252":30473,"44253":30475,"44254":30462,"44255":30460,"44256":30471,"44257":30684,"44258":30722,"44259":30740,"44260":30732,"44261":30733,"44262":31046,"44263":31049,"44264":31048,"44265":31047,"44266":31161,"44267":31162,"44268":31185,"44269":31186,"44270":31179,"44271":31359,"44272":31361,"44273":31487,"44274":31485,"44275":31869,"44276":32002,"44277":32005,"44278":32000,"44279":32009,"44280":32007,"44281":32004,"44282":32006,"44283":32568,"44284":32654,"44285":32703,"44286":32772,"44352":32784,"44353":32781,"44354":32785,"44355":32822,"44356":32982,"44357":32997,"44358":32986,"44359":32963,"44360":32964,"44361":32972,"44362":32993,"44363":32987,"44364":32974,"44365":32990,"44366":32996,"44367":32989,"44368":33268,"44369":33314,"44370":33511,"44371":33539,"44372":33541,"44373":33507,"44374":33499,"44375":33510,"44376":33540,"44377":33509,"44378":33538,"44379":33545,"44380":33490,"44381":33495,"44382":33521,"44383":33537,"44384":33500,"44385":33492,"44386":33489,"44387":33502,"44388":33491,"44389":33503,"44390":33519,"44391":33542,"44392":34384,"44393":34425,"44394":34427,"44395":34426,"44396":34893,"44397":34923,"44398":35201,"44399":35284,"44400":35336,"44401":35330,"44402":35331,"44403":35998,"44404":36000,"44405":36212,"44406":36211,"44407":36276,"44408":36557,"44409":36556,"44410":36848,"44411":36838,"44412":36834,"44413":36842,"44414":36837,"44449":36845,"44450":36843,"44451":36836,"44452":36840,"44453":37066,"44454":37070,"44455":37057,"44456":37059,"44457":37195,"44458":37194,"44459":37325,"44460":38274,"44461":38480,"44462":38475,"44463":38476,"44464":38477,"44465":38754,"44466":38761,"44467":38859,"44468":38893,"44469":38899,"44470":38913,"44471":39080,"44472":39131,"44473":39135,"44474":39318,"44475":39321,"44476":20056,"44477":20147,"44478":20492,"44479":20493,"44480":20515,"44481":20463,"44482":20518,"44483":20517,"44484":20472,"44485":20521,"44486":20502,"44487":20486,"44488":20540,"44489":20511,"44490":20506,"44491":20498,"44492":20497,"44493":20474,"44494":20480,"44495":20500,"44496":20520,"44497":20465,"44498":20513,"44499":20491,"44500":20505,"44501":20504,"44502":20467,"44503":20462,"44504":20525,"44505":20522,"44506":20478,"44507":20523,"44508":20489,"44509":20860,"44510":20900,"44511":20901,"44512":20898,"44513":20941,"44514":20940,"44515":20934,"44516":20939,"44517":21078,"44518":21084,"44519":21076,"44520":21083,"44521":21085,"44522":21290,"44523":21375,"44524":21407,"44525":21405,"44526":21471,"44527":21736,"44528":21776,"44529":21761,"44530":21815,"44531":21756,"44532":21733,"44533":21746,"44534":21766,"44535":21754,"44536":21780,"44537":21737,"44538":21741,"44539":21729,"44540":21769,"44541":21742,"44542":21738,"44608":21734,"44609":21799,"44610":21767,"44611":21757,"44612":21775,"44613":22275,"44614":22276,"44615":22466,"44616":22484,"44617":22475,"44618":22467,"44619":22537,"44620":22799,"44621":22871,"44622":22872,"44623":22874,"44624":23057,"44625":23064,"44626":23068,"44627":23071,"44628":23067,"44629":23059,"44630":23020,"44631":23072,"44632":23075,"44633":23081,"44634":23077,"44635":23052,"44636":23049,"44637":23403,"44638":23640,"44639":23472,"44640":23475,"44641":23478,"44642":23476,"44643":23470,"44644":23477,"44645":23481,"44646":23480,"44647":23556,"44648":23633,"44649":23637,"44650":23632,"44651":23789,"44652":23805,"44653":23803,"44654":23786,"44655":23784,"44656":23792,"44657":23798,"44658":23809,"44659":23796,"44660":24046,"44661":24109,"44662":24107,"44663":24235,"44664":24237,"44665":24231,"44666":24369,"44667":24466,"44668":24465,"44669":24464,"44670":24665,"44705":24675,"44706":24677,"44707":24656,"44708":24661,"44709":24685,"44710":24681,"44711":24687,"44712":24708,"44713":24735,"44714":24730,"44715":24717,"44716":24724,"44717":24716,"44718":24709,"44719":24726,"44720":25159,"44721":25331,"44722":25352,"44723":25343,"44724":25422,"44725":25406,"44726":25391,"44727":25429,"44728":25410,"44729":25414,"44730":25423,"44731":25417,"44732":25402,"44733":25424,"44734":25405,"44735":25386,"44736":25387,"44737":25384,"44738":25421,"44739":25420,"44740":25928,"44741":25929,"44742":26009,"44743":26049,"44744":26053,"44745":26178,"44746":26185,"44747":26191,"44748":26179,"44749":26194,"44750":26188,"44751":26181,"44752":26177,"44753":26360,"44754":26388,"44755":26389,"44756":26391,"44757":26657,"44758":26680,"44759":26696,"44760":26694,"44761":26707,"44762":26681,"44763":26690,"44764":26708,"44765":26665,"44766":26803,"44767":26647,"44768":26700,"44769":26705,"44770":26685,"44771":26612,"44772":26704,"44773":26688,"44774":26684,"44775":26691,"44776":26666,"44777":26693,"44778":26643,"44779":26648,"44780":26689,"44781":27530,"44782":27529,"44783":27575,"44784":27683,"44785":27687,"44786":27688,"44787":27686,"44788":27684,"44789":27888,"44790":28010,"44791":28053,"44792":28040,"44793":28039,"44794":28006,"44795":28024,"44796":28023,"44797":27993,"44798":28051,"44864":28012,"44865":28041,"44866":28014,"44867":27994,"44868":28020,"44869":28009,"44870":28044,"44871":28042,"44872":28025,"44873":28037,"44874":28005,"44875":28052,"44876":28874,"44877":28888,"44878":28900,"44879":28889,"44880":28872,"44881":28879,"44882":29241,"44883":29305,"44884":29436,"44885":29433,"44886":29437,"44887":29432,"44888":29431,"44889":29574,"44890":29677,"44891":29705,"44892":29678,"44893":29664,"44894":29674,"44895":29662,"44896":30036,"44897":30045,"44898":30044,"44899":30042,"44900":30041,"44901":30142,"44902":30149,"44903":30151,"44904":30130,"44905":30131,"44906":30141,"44907":30140,"44908":30137,"44909":30146,"44910":30136,"44911":30347,"44912":30384,"44913":30410,"44914":30413,"44915":30414,"44916":30505,"44917":30495,"44918":30496,"44919":30504,"44920":30697,"44921":30768,"44922":30759,"44923":30776,"44924":30749,"44925":30772,"44926":30775,"44961":30757,"44962":30765,"44963":30752,"44964":30751,"44965":30770,"44966":31061,"44967":31056,"44968":31072,"44969":31071,"44970":31062,"44971":31070,"44972":31069,"44973":31063,"44974":31066,"44975":31204,"44976":31203,"44977":31207,"44978":31199,"44979":31206,"44980":31209,"44981":31192,"44982":31364,"44983":31368,"44984":31449,"44985":31494,"44986":31505,"44987":31881,"44988":32033,"44989":32023,"44990":32011,"44991":32010,"44992":32032,"44993":32034,"44994":32020,"44995":32016,"44996":32021,"44997":32026,"44998":32028,"44999":32013,"45000":32025,"45001":32027,"45002":32570,"45003":32607,"45004":32660,"45005":32709,"45006":32705,"45007":32774,"45008":32792,"45009":32789,"45010":32793,"45011":32791,"45012":32829,"45013":32831,"45014":33009,"45015":33026,"45016":33008,"45017":33029,"45018":33005,"45019":33012,"45020":33030,"45021":33016,"45022":33011,"45023":33032,"45024":33021,"45025":33034,"45026":33020,"45027":33007,"45028":33261,"45029":33260,"45030":33280,"45031":33296,"45032":33322,"45033":33323,"45034":33320,"45035":33324,"45036":33467,"45037":33579,"45038":33618,"45039":33620,"45040":33610,"45041":33592,"45042":33616,"45043":33609,"45044":33589,"45045":33588,"45046":33615,"45047":33586,"45048":33593,"45049":33590,"45050":33559,"45051":33600,"45052":33585,"45053":33576,"45054":33603,"45120":34388,"45121":34442,"45122":34474,"45123":34451,"45124":34468,"45125":34473,"45126":34444,"45127":34467,"45128":34460,"45129":34928,"45130":34935,"45131":34945,"45132":34946,"45133":34941,"45134":34937,"45135":35352,"45136":35344,"45137":35342,"45138":35340,"45139":35349,"45140":35338,"45141":35351,"45142":35347,"45143":35350,"45144":35343,"45145":35345,"45146":35912,"45147":35962,"45148":35961,"45149":36001,"45150":36002,"45151":36215,"45152":36524,"45153":36562,"45154":36564,"45155":36559,"45156":36785,"45157":36865,"45158":36870,"45159":36855,"45160":36864,"45161":36858,"45162":36852,"45163":36867,"45164":36861,"45165":36869,"45166":36856,"45167":37013,"45168":37089,"45169":37085,"45170":37090,"45171":37202,"45172":37197,"45173":37196,"45174":37336,"45175":37341,"45176":37335,"45177":37340,"45178":37337,"45179":38275,"45180":38498,"45181":38499,"45182":38497,"45217":38491,"45218":38493,"45219":38500,"45220":38488,"45221":38494,"45222":38587,"45223":39138,"45224":39340,"45225":39592,"45226":39640,"45227":39717,"45228":39730,"45229":39740,"45230":20094,"45231":20602,"45232":20605,"45233":20572,"45234":20551,"45235":20547,"45236":20556,"45237":20570,"45238":20553,"45239":20581,"45240":20598,"45241":20558,"45242":20565,"45243":20597,"45244":20596,"45245":20599,"45246":20559,"45247":20495,"45248":20591,"45249":20589,"45250":20828,"45251":20885,"45252":20976,"45253":21098,"45254":21103,"45255":21202,"45256":21209,"45257":21208,"45258":21205,"45259":21264,"45260":21263,"45261":21273,"45262":21311,"45263":21312,"45264":21310,"45265":21443,"45266":26364,"45267":21830,"45268":21866,"45269":21862,"45270":21828,"45271":21854,"45272":21857,"45273":21827,"45274":21834,"45275":21809,"45276":21846,"45277":21839,"45278":21845,"45279":21807,"45280":21860,"45281":21816,"45282":21806,"45283":21852,"45284":21804,"45285":21859,"45286":21811,"45287":21825,"45288":21847,"45289":22280,"45290":22283,"45291":22281,"45292":22495,"45293":22533,"45294":22538,"45295":22534,"45296":22496,"45297":22500,"45298":22522,"45299":22530,"45300":22581,"45301":22519,"45302":22521,"45303":22816,"45304":22882,"45305":23094,"45306":23105,"45307":23113,"45308":23142,"45309":23146,"45310":23104,"45376":23100,"45377":23138,"45378":23130,"45379":23110,"45380":23114,"45381":23408,"45382":23495,"45383":23493,"45384":23492,"45385":23490,"45386":23487,"45387":23494,"45388":23561,"45389":23560,"45390":23559,"45391":23648,"45392":23644,"45393":23645,"45394":23815,"45395":23814,"45396":23822,"45397":23835,"45398":23830,"45399":23842,"45400":23825,"45401":23849,"45402":23828,"45403":23833,"45404":23844,"45405":23847,"45406":23831,"45407":24034,"45408":24120,"45409":24118,"45410":24115,"45411":24119,"45412":24247,"45413":24248,"45414":24246,"45415":24245,"45416":24254,"45417":24373,"45418":24375,"45419":24407,"45420":24428,"45421":24425,"45422":24427,"45423":24471,"45424":24473,"45425":24478,"45426":24472,"45427":24481,"45428":24480,"45429":24476,"45430":24703,"45431":24739,"45432":24713,"45433":24736,"45434":24744,"45435":24779,"45436":24756,"45437":24806,"45438":24765,"45473":24773,"45474":24763,"45475":24757,"45476":24796,"45477":24764,"45478":24792,"45479":24789,"45480":24774,"45481":24799,"45482":24760,"45483":24794,"45484":24775,"45485":25114,"45486":25115,"45487":25160,"45488":25504,"45489":25511,"45490":25458,"45491":25494,"45492":25506,"45493":25509,"45494":25463,"45495":25447,"45496":25496,"45497":25514,"45498":25457,"45499":25513,"45500":25481,"45501":25475,"45502":25499,"45503":25451,"45504":25512,"45505":25476,"45506":25480,"45507":25497,"45508":25505,"45509":25516,"45510":25490,"45511":25487,"45512":25472,"45513":25467,"45514":25449,"45515":25448,"45516":25466,"45517":25949,"45518":25942,"45519":25937,"45520":25945,"45521":25943,"45522":21855,"45523":25935,"45524":25944,"45525":25941,"45526":25940,"45527":26012,"45528":26011,"45529":26028,"45530":26063,"45531":26059,"45532":26060,"45533":26062,"45534":26205,"45535":26202,"45536":26212,"45537":26216,"45538":26214,"45539":26206,"45540":26361,"45541":21207,"45542":26395,"45543":26753,"45544":26799,"45545":26786,"45546":26771,"45547":26805,"45548":26751,"45549":26742,"45550":26801,"45551":26791,"45552":26775,"45553":26800,"45554":26755,"45555":26820,"45556":26797,"45557":26758,"45558":26757,"45559":26772,"45560":26781,"45561":26792,"45562":26783,"45563":26785,"45564":26754,"45565":27442,"45566":27578,"45632":27627,"45633":27628,"45634":27691,"45635":28046,"45636":28092,"45637":28147,"45638":28121,"45639":28082,"45640":28129,"45641":28108,"45642":28132,"45643":28155,"45644":28154,"45645":28165,"45646":28103,"45647":28107,"45648":28079,"45649":28113,"45650":28078,"45651":28126,"45652":28153,"45653":28088,"45654":28151,"45655":28149,"45656":28101,"45657":28114,"45658":28186,"45659":28085,"45660":28122,"45661":28139,"45662":28120,"45663":28138,"45664":28145,"45665":28142,"45666":28136,"45667":28102,"45668":28100,"45669":28074,"45670":28140,"45671":28095,"45672":28134,"45673":28921,"45674":28937,"45675":28938,"45676":28925,"45677":28911,"45678":29245,"45679":29309,"45680":29313,"45681":29468,"45682":29467,"45683":29462,"45684":29459,"45685":29465,"45686":29575,"45687":29701,"45688":29706,"45689":29699,"45690":29702,"45691":29694,"45692":29709,"45693":29920,"45694":29942,"45729":29943,"45730":29980,"45731":29986,"45732":30053,"45733":30054,"45734":30050,"45735":30064,"45736":30095,"45737":30164,"45738":30165,"45739":30133,"45740":30154,"45741":30157,"45742":30350,"45743":30420,"45744":30418,"45745":30427,"45746":30519,"45747":30526,"45748":30524,"45749":30518,"45750":30520,"45751":30522,"45752":30827,"45753":30787,"45754":30798,"45755":31077,"45756":31080,"45757":31085,"45758":31227,"45759":31378,"45760":31381,"45761":31520,"45762":31528,"45763":31515,"45764":31532,"45765":31526,"45766":31513,"45767":31518,"45768":31534,"45769":31890,"45770":31895,"45771":31893,"45772":32070,"45773":32067,"45774":32113,"45775":32046,"45776":32057,"45777":32060,"45778":32064,"45779":32048,"45780":32051,"45781":32068,"45782":32047,"45783":32066,"45784":32050,"45785":32049,"45786":32573,"45787":32670,"45788":32666,"45789":32716,"45790":32718,"45791":32722,"45792":32796,"45793":32842,"45794":32838,"45795":33071,"45796":33046,"45797":33059,"45798":33067,"45799":33065,"45800":33072,"45801":33060,"45802":33282,"45803":33333,"45804":33335,"45805":33334,"45806":33337,"45807":33678,"45808":33694,"45809":33688,"45810":33656,"45811":33698,"45812":33686,"45813":33725,"45814":33707,"45815":33682,"45816":33674,"45817":33683,"45818":33673,"45819":33696,"45820":33655,"45821":33659,"45822":33660,"45888":33670,"45889":33703,"45890":34389,"45891":24426,"45892":34503,"45893":34496,"45894":34486,"45895":34500,"45896":34485,"45897":34502,"45898":34507,"45899":34481,"45900":34479,"45901":34505,"45902":34899,"45903":34974,"45904":34952,"45905":34987,"45906":34962,"45907":34966,"45908":34957,"45909":34955,"45910":35219,"45911":35215,"45912":35370,"45913":35357,"45914":35363,"45915":35365,"45916":35377,"45917":35373,"45918":35359,"45919":35355,"45920":35362,"45921":35913,"45922":35930,"45923":36009,"45924":36012,"45925":36011,"45926":36008,"45927":36010,"45928":36007,"45929":36199,"45930":36198,"45931":36286,"45932":36282,"45933":36571,"45934":36575,"45935":36889,"45936":36877,"45937":36890,"45938":36887,"45939":36899,"45940":36895,"45941":36893,"45942":36880,"45943":36885,"45944":36894,"45945":36896,"45946":36879,"45947":36898,"45948":36886,"45949":36891,"45950":36884,"45985":37096,"45986":37101,"45987":37117,"45988":37207,"45989":37326,"45990":37365,"45991":37350,"45992":37347,"45993":37351,"45994":37357,"45995":37353,"45996":38281,"45997":38506,"45998":38517,"45999":38515,"46000":38520,"46001":38512,"46002":38516,"46003":38518,"46004":38519,"46005":38508,"46006":38592,"46007":38634,"46008":38633,"46009":31456,"46010":31455,"46011":38914,"46012":38915,"46013":39770,"46014":40165,"46015":40565,"46016":40575,"46017":40613,"46018":40635,"46019":20642,"46020":20621,"46021":20613,"46022":20633,"46023":20625,"46024":20608,"46025":20630,"46026":20632,"46027":20634,"46028":26368,"46029":20977,"46030":21106,"46031":21108,"46032":21109,"46033":21097,"46034":21214,"46035":21213,"46036":21211,"46037":21338,"46038":21413,"46039":21883,"46040":21888,"46041":21927,"46042":21884,"46043":21898,"46044":21917,"46045":21912,"46046":21890,"46047":21916,"46048":21930,"46049":21908,"46050":21895,"46051":21899,"46052":21891,"46053":21939,"46054":21934,"46055":21919,"46056":21822,"46057":21938,"46058":21914,"46059":21947,"46060":21932,"46061":21937,"46062":21886,"46063":21897,"46064":21931,"46065":21913,"46066":22285,"46067":22575,"46068":22570,"46069":22580,"46070":22564,"46071":22576,"46072":22577,"46073":22561,"46074":22557,"46075":22560,"46076":22777,"46077":22778,"46078":22880,"46144":23159,"46145":23194,"46146":23167,"46147":23186,"46148":23195,"46149":23207,"46150":23411,"46151":23409,"46152":23506,"46153":23500,"46154":23507,"46155":23504,"46156":23562,"46157":23563,"46158":23601,"46159":23884,"46160":23888,"46161":23860,"46162":23879,"46163":24061,"46164":24133,"46165":24125,"46166":24128,"46167":24131,"46168":24190,"46169":24266,"46170":24257,"46171":24258,"46172":24260,"46173":24380,"46174":24429,"46175":24489,"46176":24490,"46177":24488,"46178":24785,"46179":24801,"46180":24754,"46181":24758,"46182":24800,"46183":24860,"46184":24867,"46185":24826,"46186":24853,"46187":24816,"46188":24827,"46189":24820,"46190":24936,"46191":24817,"46192":24846,"46193":24822,"46194":24841,"46195":24832,"46196":24850,"46197":25119,"46198":25161,"46199":25507,"46200":25484,"46201":25551,"46202":25536,"46203":25577,"46204":25545,"46205":25542,"46206":25549,"46241":25554,"46242":25571,"46243":25552,"46244":25569,"46245":25558,"46246":25581,"46247":25582,"46248":25462,"46249":25588,"46250":25578,"46251":25563,"46252":25682,"46253":25562,"46254":25593,"46255":25950,"46256":25958,"46257":25954,"46258":25955,"46259":26001,"46260":26000,"46261":26031,"46262":26222,"46263":26224,"46264":26228,"46265":26230,"46266":26223,"46267":26257,"46268":26234,"46269":26238,"46270":26231,"46271":26366,"46272":26367,"46273":26399,"46274":26397,"46275":26874,"46276":26837,"46277":26848,"46278":26840,"46279":26839,"46280":26885,"46281":26847,"46282":26869,"46283":26862,"46284":26855,"46285":26873,"46286":26834,"46287":26866,"46288":26851,"46289":26827,"46290":26829,"46291":26893,"46292":26898,"46293":26894,"46294":26825,"46295":26842,"46296":26990,"46297":26875,"46298":27454,"46299":27450,"46300":27453,"46301":27544,"46302":27542,"46303":27580,"46304":27631,"46305":27694,"46306":27695,"46307":27692,"46308":28207,"46309":28216,"46310":28244,"46311":28193,"46312":28210,"46313":28263,"46314":28234,"46315":28192,"46316":28197,"46317":28195,"46318":28187,"46319":28251,"46320":28248,"46321":28196,"46322":28246,"46323":28270,"46324":28205,"46325":28198,"46326":28271,"46327":28212,"46328":28237,"46329":28218,"46330":28204,"46331":28227,"46332":28189,"46333":28222,"46334":28363,"46400":28297,"46401":28185,"46402":28238,"46403":28259,"46404":28228,"46405":28274,"46406":28265,"46407":28255,"46408":28953,"46409":28954,"46410":28966,"46411":28976,"46412":28961,"46413":28982,"46414":29038,"46415":28956,"46416":29260,"46417":29316,"46418":29312,"46419":29494,"46420":29477,"46421":29492,"46422":29481,"46423":29754,"46424":29738,"46425":29747,"46426":29730,"46427":29733,"46428":29749,"46429":29750,"46430":29748,"46431":29743,"46432":29723,"46433":29734,"46434":29736,"46435":29989,"46436":29990,"46437":30059,"46438":30058,"46439":30178,"46440":30171,"46441":30179,"46442":30169,"46443":30168,"46444":30174,"46445":30176,"46446":30331,"46447":30332,"46448":30358,"46449":30355,"46450":30388,"46451":30428,"46452":30543,"46453":30701,"46454":30813,"46455":30828,"46456":30831,"46457":31245,"46458":31240,"46459":31243,"46460":31237,"46461":31232,"46462":31384,"46497":31383,"46498":31382,"46499":31461,"46500":31459,"46501":31561,"46502":31574,"46503":31558,"46504":31568,"46505":31570,"46506":31572,"46507":31565,"46508":31563,"46509":31567,"46510":31569,"46511":31903,"46512":31909,"46513":32094,"46514":32080,"46515":32104,"46516":32085,"46517":32043,"46518":32110,"46519":32114,"46520":32097,"46521":32102,"46522":32098,"46523":32112,"46524":32115,"46525":21892,"46526":32724,"46527":32725,"46528":32779,"46529":32850,"46530":32901,"46531":33109,"46532":33108,"46533":33099,"46534":33105,"46535":33102,"46536":33081,"46537":33094,"46538":33086,"46539":33100,"46540":33107,"46541":33140,"46542":33298,"46543":33308,"46544":33769,"46545":33795,"46546":33784,"46547":33805,"46548":33760,"46549":33733,"46550":33803,"46551":33729,"46552":33775,"46553":33777,"46554":33780,"46555":33879,"46556":33802,"46557":33776,"46558":33804,"46559":33740,"46560":33789,"46561":33778,"46562":33738,"46563":33848,"46564":33806,"46565":33796,"46566":33756,"46567":33799,"46568":33748,"46569":33759,"46570":34395,"46571":34527,"46572":34521,"46573":34541,"46574":34516,"46575":34523,"46576":34532,"46577":34512,"46578":34526,"46579":34903,"46580":35009,"46581":35010,"46582":34993,"46583":35203,"46584":35222,"46585":35387,"46586":35424,"46587":35413,"46588":35422,"46589":35388,"46590":35393,"46656":35412,"46657":35419,"46658":35408,"46659":35398,"46660":35380,"46661":35386,"46662":35382,"46663":35414,"46664":35937,"46665":35970,"46666":36015,"46667":36028,"46668":36019,"46669":36029,"46670":36033,"46671":36027,"46672":36032,"46673":36020,"46674":36023,"46675":36022,"46676":36031,"46677":36024,"46678":36234,"46679":36229,"46680":36225,"46681":36302,"46682":36317,"46683":36299,"46684":36314,"46685":36305,"46686":36300,"46687":36315,"46688":36294,"46689":36603,"46690":36600,"46691":36604,"46692":36764,"46693":36910,"46694":36917,"46695":36913,"46696":36920,"46697":36914,"46698":36918,"46699":37122,"46700":37109,"46701":37129,"46702":37118,"46703":37219,"46704":37221,"46705":37327,"46706":37396,"46707":37397,"46708":37411,"46709":37385,"46710":37406,"46711":37389,"46712":37392,"46713":37383,"46714":37393,"46715":38292,"46716":38287,"46717":38283,"46718":38289,"46753":38291,"46754":38290,"46755":38286,"46756":38538,"46757":38542,"46758":38539,"46759":38525,"46760":38533,"46761":38534,"46762":38541,"46763":38514,"46764":38532,"46765":38593,"46766":38597,"46767":38596,"46768":38598,"46769":38599,"46770":38639,"46771":38642,"46772":38860,"46773":38917,"46774":38918,"46775":38920,"46776":39143,"46777":39146,"46778":39151,"46779":39145,"46780":39154,"46781":39149,"46782":39342,"46783":39341,"46784":40643,"46785":40653,"46786":40657,"46787":20098,"46788":20653,"46789":20661,"46790":20658,"46791":20659,"46792":20677,"46793":20670,"46794":20652,"46795":20663,"46796":20667,"46797":20655,"46798":20679,"46799":21119,"46800":21111,"46801":21117,"46802":21215,"46803":21222,"46804":21220,"46805":21218,"46806":21219,"46807":21295,"46808":21983,"46809":21992,"46810":21971,"46811":21990,"46812":21966,"46813":21980,"46814":21959,"46815":21969,"46816":21987,"46817":21988,"46818":21999,"46819":21978,"46820":21985,"46821":21957,"46822":21958,"46823":21989,"46824":21961,"46825":22290,"46826":22291,"46827":22622,"46828":22609,"46829":22616,"46830":22615,"46831":22618,"46832":22612,"46833":22635,"46834":22604,"46835":22637,"46836":22602,"46837":22626,"46838":22610,"46839":22603,"46840":22887,"46841":23233,"46842":23241,"46843":23244,"46844":23230,"46845":23229,"46846":23228,"46912":23219,"46913":23234,"46914":23218,"46915":23913,"46916":23919,"46917":24140,"46918":24185,"46919":24265,"46920":24264,"46921":24338,"46922":24409,"46923":24492,"46924":24494,"46925":24858,"46926":24847,"46927":24904,"46928":24863,"46929":24819,"46930":24859,"46931":24825,"46932":24833,"46933":24840,"46934":24910,"46935":24908,"46936":24900,"46937":24909,"46938":24894,"46939":24884,"46940":24871,"46941":24845,"46942":24838,"46943":24887,"46944":25121,"46945":25122,"46946":25619,"46947":25662,"46948":25630,"46949":25642,"46950":25645,"46951":25661,"46952":25644,"46953":25615,"46954":25628,"46955":25620,"46956":25613,"46957":25654,"46958":25622,"46959":25623,"46960":25606,"46961":25964,"46962":26015,"46963":26032,"46964":26263,"46965":26249,"46966":26247,"46967":26248,"46968":26262,"46969":26244,"46970":26264,"46971":26253,"46972":26371,"46973":27028,"46974":26989,"47009":26970,"47010":26999,"47011":26976,"47012":26964,"47013":26997,"47014":26928,"47015":27010,"47016":26954,"47017":26984,"47018":26987,"47019":26974,"47020":26963,"47021":27001,"47022":27014,"47023":26973,"47024":26979,"47025":26971,"47026":27463,"47027":27506,"47028":27584,"47029":27583,"47030":27603,"47031":27645,"47032":28322,"47033":28335,"47034":28371,"47035":28342,"47036":28354,"47037":28304,"47038":28317,"47039":28359,"47040":28357,"47041":28325,"47042":28312,"47043":28348,"47044":28346,"47045":28331,"47046":28369,"47047":28310,"47048":28316,"47049":28356,"47050":28372,"47051":28330,"47052":28327,"47053":28340,"47054":29006,"47055":29017,"47056":29033,"47057":29028,"47058":29001,"47059":29031,"47060":29020,"47061":29036,"47062":29030,"47063":29004,"47064":29029,"47065":29022,"47066":28998,"47067":29032,"47068":29014,"47069":29242,"47070":29266,"47071":29495,"47072":29509,"47073":29503,"47074":29502,"47075":29807,"47076":29786,"47077":29781,"47078":29791,"47079":29790,"47080":29761,"47081":29759,"47082":29785,"47083":29787,"47084":29788,"47085":30070,"47086":30072,"47087":30208,"47088":30192,"47089":30209,"47090":30194,"47091":30193,"47092":30202,"47093":30207,"47094":30196,"47095":30195,"47096":30430,"47097":30431,"47098":30555,"47099":30571,"47100":30566,"47101":30558,"47102":30563,"47168":30585,"47169":30570,"47170":30572,"47171":30556,"47172":30565,"47173":30568,"47174":30562,"47175":30702,"47176":30862,"47177":30896,"47178":30871,"47179":30872,"47180":30860,"47181":30857,"47182":30844,"47183":30865,"47184":30867,"47185":30847,"47186":31098,"47187":31103,"47188":31105,"47189":33836,"47190":31165,"47191":31260,"47192":31258,"47193":31264,"47194":31252,"47195":31263,"47196":31262,"47197":31391,"47198":31392,"47199":31607,"47200":31680,"47201":31584,"47202":31598,"47203":31591,"47204":31921,"47205":31923,"47206":31925,"47207":32147,"47208":32121,"47209":32145,"47210":32129,"47211":32143,"47212":32091,"47213":32622,"47214":32617,"47215":32618,"47216":32626,"47217":32681,"47218":32680,"47219":32676,"47220":32854,"47221":32856,"47222":32902,"47223":32900,"47224":33137,"47225":33136,"47226":33144,"47227":33125,"47228":33134,"47229":33139,"47230":33131,"47265":33145,"47266":33146,"47267":33126,"47268":33285,"47269":33351,"47270":33922,"47271":33911,"47272":33853,"47273":33841,"47274":33909,"47275":33894,"47276":33899,"47277":33865,"47278":33900,"47279":33883,"47280":33852,"47281":33845,"47282":33889,"47283":33891,"47284":33897,"47285":33901,"47286":33862,"47287":34398,"47288":34396,"47289":34399,"47290":34553,"47291":34579,"47292":34568,"47293":34567,"47294":34560,"47295":34558,"47296":34555,"47297":34562,"47298":34563,"47299":34566,"47300":34570,"47301":34905,"47302":35039,"47303":35028,"47304":35033,"47305":35036,"47306":35032,"47307":35037,"47308":35041,"47309":35018,"47310":35029,"47311":35026,"47312":35228,"47313":35299,"47314":35435,"47315":35442,"47316":35443,"47317":35430,"47318":35433,"47319":35440,"47320":35463,"47321":35452,"47322":35427,"47323":35488,"47324":35441,"47325":35461,"47326":35437,"47327":35426,"47328":35438,"47329":35436,"47330":35449,"47331":35451,"47332":35390,"47333":35432,"47334":35938,"47335":35978,"47336":35977,"47337":36042,"47338":36039,"47339":36040,"47340":36036,"47341":36018,"47342":36035,"47343":36034,"47344":36037,"47345":36321,"47346":36319,"47347":36328,"47348":36335,"47349":36339,"47350":36346,"47351":36330,"47352":36324,"47353":36326,"47354":36530,"47355":36611,"47356":36617,"47357":36606,"47358":36618,"47424":36767,"47425":36786,"47426":36939,"47427":36938,"47428":36947,"47429":36930,"47430":36948,"47431":36924,"47432":36949,"47433":36944,"47434":36935,"47435":36943,"47436":36942,"47437":36941,"47438":36945,"47439":36926,"47440":36929,"47441":37138,"47442":37143,"47443":37228,"47444":37226,"47445":37225,"47446":37321,"47447":37431,"47448":37463,"47449":37432,"47450":37437,"47451":37440,"47452":37438,"47453":37467,"47454":37451,"47455":37476,"47456":37457,"47457":37428,"47458":37449,"47459":37453,"47460":37445,"47461":37433,"47462":37439,"47463":37466,"47464":38296,"47465":38552,"47466":38548,"47467":38549,"47468":38605,"47469":38603,"47470":38601,"47471":38602,"47472":38647,"47473":38651,"47474":38649,"47475":38646,"47476":38742,"47477":38772,"47478":38774,"47479":38928,"47480":38929,"47481":38931,"47482":38922,"47483":38930,"47484":38924,"47485":39164,"47486":39156,"47521":39165,"47522":39166,"47523":39347,"47524":39345,"47525":39348,"47526":39649,"47527":40169,"47528":40578,"47529":40718,"47530":40723,"47531":40736,"47532":20711,"47533":20718,"47534":20709,"47535":20694,"47536":20717,"47537":20698,"47538":20693,"47539":20687,"47540":20689,"47541":20721,"47542":20686,"47543":20713,"47544":20834,"47545":20979,"47546":21123,"47547":21122,"47548":21297,"47549":21421,"47550":22014,"47551":22016,"47552":22043,"47553":22039,"47554":22013,"47555":22036,"47556":22022,"47557":22025,"47558":22029,"47559":22030,"47560":22007,"47561":22038,"47562":22047,"47563":22024,"47564":22032,"47565":22006,"47566":22296,"47567":22294,"47568":22645,"47569":22654,"47570":22659,"47571":22675,"47572":22666,"47573":22649,"47574":22661,"47575":22653,"47576":22781,"47577":22821,"47578":22818,"47579":22820,"47580":22890,"47581":22889,"47582":23265,"47583":23270,"47584":23273,"47585":23255,"47586":23254,"47587":23256,"47588":23267,"47589":23413,"47590":23518,"47591":23527,"47592":23521,"47593":23525,"47594":23526,"47595":23528,"47596":23522,"47597":23524,"47598":23519,"47599":23565,"47600":23650,"47601":23940,"47602":23943,"47603":24155,"47604":24163,"47605":24149,"47606":24151,"47607":24148,"47608":24275,"47609":24278,"47610":24330,"47611":24390,"47612":24432,"47613":24505,"47614":24903,"47680":24895,"47681":24907,"47682":24951,"47683":24930,"47684":24931,"47685":24927,"47686":24922,"47687":24920,"47688":24949,"47689":25130,"47690":25735,"47691":25688,"47692":25684,"47693":25764,"47694":25720,"47695":25695,"47696":25722,"47697":25681,"47698":25703,"47699":25652,"47700":25709,"47701":25723,"47702":25970,"47703":26017,"47704":26071,"47705":26070,"47706":26274,"47707":26280,"47708":26269,"47709":27036,"47710":27048,"47711":27029,"47712":27073,"47713":27054,"47714":27091,"47715":27083,"47716":27035,"47717":27063,"47718":27067,"47719":27051,"47720":27060,"47721":27088,"47722":27085,"47723":27053,"47724":27084,"47725":27046,"47726":27075,"47727":27043,"47728":27465,"47729":27468,"47730":27699,"47731":28467,"47732":28436,"47733":28414,"47734":28435,"47735":28404,"47736":28457,"47737":28478,"47738":28448,"47739":28460,"47740":28431,"47741":28418,"47742":28450,"47777":28415,"47778":28399,"47779":28422,"47780":28465,"47781":28472,"47782":28466,"47783":28451,"47784":28437,"47785":28459,"47786":28463,"47787":28552,"47788":28458,"47789":28396,"47790":28417,"47791":28402,"47792":28364,"47793":28407,"47794":29076,"47795":29081,"47796":29053,"47797":29066,"47798":29060,"47799":29074,"47800":29246,"47801":29330,"47802":29334,"47803":29508,"47804":29520,"47805":29796,"47806":29795,"47807":29802,"47808":29808,"47809":29805,"47810":29956,"47811":30097,"47812":30247,"47813":30221,"47814":30219,"47815":30217,"47816":30227,"47817":30433,"47818":30435,"47819":30596,"47820":30589,"47821":30591,"47822":30561,"47823":30913,"47824":30879,"47825":30887,"47826":30899,"47827":30889,"47828":30883,"47829":31118,"47830":31119,"47831":31117,"47832":31278,"47833":31281,"47834":31402,"47835":31401,"47836":31469,"47837":31471,"47838":31649,"47839":31637,"47840":31627,"47841":31605,"47842":31639,"47843":31645,"47844":31636,"47845":31631,"47846":31672,"47847":31623,"47848":31620,"47849":31929,"47850":31933,"47851":31934,"47852":32187,"47853":32176,"47854":32156,"47855":32189,"47856":32190,"47857":32160,"47858":32202,"47859":32180,"47860":32178,"47861":32177,"47862":32186,"47863":32162,"47864":32191,"47865":32181,"47866":32184,"47867":32173,"47868":32210,"47869":32199,"47870":32172,"47936":32624,"47937":32736,"47938":32737,"47939":32735,"47940":32862,"47941":32858,"47942":32903,"47943":33104,"47944":33152,"47945":33167,"47946":33160,"47947":33162,"47948":33151,"47949":33154,"47950":33255,"47951":33274,"47952":33287,"47953":33300,"47954":33310,"47955":33355,"47956":33993,"47957":33983,"47958":33990,"47959":33988,"47960":33945,"47961":33950,"47962":33970,"47963":33948,"47964":33995,"47965":33976,"47966":33984,"47967":34003,"47968":33936,"47969":33980,"47970":34001,"47971":33994,"47972":34623,"47973":34588,"47974":34619,"47975":34594,"47976":34597,"47977":34612,"47978":34584,"47979":34645,"47980":34615,"47981":34601,"47982":35059,"47983":35074,"47984":35060,"47985":35065,"47986":35064,"47987":35069,"47988":35048,"47989":35098,"47990":35055,"47991":35494,"47992":35468,"47993":35486,"47994":35491,"47995":35469,"47996":35489,"47997":35475,"47998":35492,"48033":35498,"48034":35493,"48035":35496,"48036":35480,"48037":35473,"48038":35482,"48039":35495,"48040":35946,"48041":35981,"48042":35980,"48043":36051,"48044":36049,"48045":36050,"48046":36203,"48047":36249,"48048":36245,"48049":36348,"48050":36628,"48051":36626,"48052":36629,"48053":36627,"48054":36771,"48055":36960,"48056":36952,"48057":36956,"48058":36963,"48059":36953,"48060":36958,"48061":36962,"48062":36957,"48063":36955,"48064":37145,"48065":37144,"48066":37150,"48067":37237,"48068":37240,"48069":37239,"48070":37236,"48071":37496,"48072":37504,"48073":37509,"48074":37528,"48075":37526,"48076":37499,"48077":37523,"48078":37532,"48079":37544,"48080":37500,"48081":37521,"48082":38305,"48083":38312,"48084":38313,"48085":38307,"48086":38309,"48087":38308,"48088":38553,"48089":38556,"48090":38555,"48091":38604,"48092":38610,"48093":38656,"48094":38780,"48095":38789,"48096":38902,"48097":38935,"48098":38936,"48099":39087,"48100":39089,"48101":39171,"48102":39173,"48103":39180,"48104":39177,"48105":39361,"48106":39599,"48107":39600,"48108":39654,"48109":39745,"48110":39746,"48111":40180,"48112":40182,"48113":40179,"48114":40636,"48115":40763,"48116":40778,"48117":20740,"48118":20736,"48119":20731,"48120":20725,"48121":20729,"48122":20738,"48123":20744,"48124":20745,"48125":20741,"48126":20956,"48192":21127,"48193":21128,"48194":21129,"48195":21133,"48196":21130,"48197":21232,"48198":21426,"48199":22062,"48200":22075,"48201":22073,"48202":22066,"48203":22079,"48204":22068,"48205":22057,"48206":22099,"48207":22094,"48208":22103,"48209":22132,"48210":22070,"48211":22063,"48212":22064,"48213":22656,"48214":22687,"48215":22686,"48216":22707,"48217":22684,"48218":22702,"48219":22697,"48220":22694,"48221":22893,"48222":23305,"48223":23291,"48224":23307,"48225":23285,"48226":23308,"48227":23304,"48228":23534,"48229":23532,"48230":23529,"48231":23531,"48232":23652,"48233":23653,"48234":23965,"48235":23956,"48236":24162,"48237":24159,"48238":24161,"48239":24290,"48240":24282,"48241":24287,"48242":24285,"48243":24291,"48244":24288,"48245":24392,"48246":24433,"48247":24503,"48248":24501,"48249":24950,"48250":24935,"48251":24942,"48252":24925,"48253":24917,"48254":24962,"48289":24956,"48290":24944,"48291":24939,"48292":24958,"48293":24999,"48294":24976,"48295":25003,"48296":24974,"48297":25004,"48298":24986,"48299":24996,"48300":24980,"48301":25006,"48302":25134,"48303":25705,"48304":25711,"48305":25721,"48306":25758,"48307":25778,"48308":25736,"48309":25744,"48310":25776,"48311":25765,"48312":25747,"48313":25749,"48314":25769,"48315":25746,"48316":25774,"48317":25773,"48318":25771,"48319":25754,"48320":25772,"48321":25753,"48322":25762,"48323":25779,"48324":25973,"48325":25975,"48326":25976,"48327":26286,"48328":26283,"48329":26292,"48330":26289,"48331":27171,"48332":27167,"48333":27112,"48334":27137,"48335":27166,"48336":27161,"48337":27133,"48338":27169,"48339":27155,"48340":27146,"48341":27123,"48342":27138,"48343":27141,"48344":27117,"48345":27153,"48346":27472,"48347":27470,"48348":27556,"48349":27589,"48350":27590,"48351":28479,"48352":28540,"48353":28548,"48354":28497,"48355":28518,"48356":28500,"48357":28550,"48358":28525,"48359":28507,"48360":28536,"48361":28526,"48362":28558,"48363":28538,"48364":28528,"48365":28516,"48366":28567,"48367":28504,"48368":28373,"48369":28527,"48370":28512,"48371":28511,"48372":29087,"48373":29100,"48374":29105,"48375":29096,"48376":29270,"48377":29339,"48378":29518,"48379":29527,"48380":29801,"48381":29835,"48382":29827,"48448":29822,"48449":29824,"48450":30079,"48451":30240,"48452":30249,"48453":30239,"48454":30244,"48455":30246,"48456":30241,"48457":30242,"48458":30362,"48459":30394,"48460":30436,"48461":30606,"48462":30599,"48463":30604,"48464":30609,"48465":30603,"48466":30923,"48467":30917,"48468":30906,"48469":30922,"48470":30910,"48471":30933,"48472":30908,"48473":30928,"48474":31295,"48475":31292,"48476":31296,"48477":31293,"48478":31287,"48479":31291,"48480":31407,"48481":31406,"48482":31661,"48483":31665,"48484":31684,"48485":31668,"48486":31686,"48487":31687,"48488":31681,"48489":31648,"48490":31692,"48491":31946,"48492":32224,"48493":32244,"48494":32239,"48495":32251,"48496":32216,"48497":32236,"48498":32221,"48499":32232,"48500":32227,"48501":32218,"48502":32222,"48503":32233,"48504":32158,"48505":32217,"48506":32242,"48507":32249,"48508":32629,"48509":32631,"48510":32687,"48545":32745,"48546":32806,"48547":33179,"48548":33180,"48549":33181,"48550":33184,"48551":33178,"48552":33176,"48553":34071,"48554":34109,"48555":34074,"48556":34030,"48557":34092,"48558":34093,"48559":34067,"48560":34065,"48561":34083,"48562":34081,"48563":34068,"48564":34028,"48565":34085,"48566":34047,"48567":34054,"48568":34690,"48569":34676,"48570":34678,"48571":34656,"48572":34662,"48573":34680,"48574":34664,"48575":34649,"48576":34647,"48577":34636,"48578":34643,"48579":34907,"48580":34909,"48581":35088,"48582":35079,"48583":35090,"48584":35091,"48585":35093,"48586":35082,"48587":35516,"48588":35538,"48589":35527,"48590":35524,"48591":35477,"48592":35531,"48593":35576,"48594":35506,"48595":35529,"48596":35522,"48597":35519,"48598":35504,"48599":35542,"48600":35533,"48601":35510,"48602":35513,"48603":35547,"48604":35916,"48605":35918,"48606":35948,"48607":36064,"48608":36062,"48609":36070,"48610":36068,"48611":36076,"48612":36077,"48613":36066,"48614":36067,"48615":36060,"48616":36074,"48617":36065,"48618":36205,"48619":36255,"48620":36259,"48621":36395,"48622":36368,"48623":36381,"48624":36386,"48625":36367,"48626":36393,"48627":36383,"48628":36385,"48629":36382,"48630":36538,"48631":36637,"48632":36635,"48633":36639,"48634":36649,"48635":36646,"48636":36650,"48637":36636,"48638":36638,"48704":36645,"48705":36969,"48706":36974,"48707":36968,"48708":36973,"48709":36983,"48710":37168,"48711":37165,"48712":37159,"48713":37169,"48714":37255,"48715":37257,"48716":37259,"48717":37251,"48718":37573,"48719":37563,"48720":37559,"48721":37610,"48722":37548,"48723":37604,"48724":37569,"48725":37555,"48726":37564,"48727":37586,"48728":37575,"48729":37616,"48730":37554,"48731":38317,"48732":38321,"48733":38660,"48734":38662,"48735":38663,"48736":38665,"48737":38752,"48738":38797,"48739":38795,"48740":38799,"48741":38945,"48742":38955,"48743":38940,"48744":39091,"48745":39178,"48746":39187,"48747":39186,"48748":39192,"48749":39389,"48750":39376,"48751":39391,"48752":39387,"48753":39377,"48754":39381,"48755":39378,"48756":39385,"48757":39607,"48758":39662,"48759":39663,"48760":39719,"48761":39749,"48762":39748,"48763":39799,"48764":39791,"48765":40198,"48766":40201,"48801":40195,"48802":40617,"48803":40638,"48804":40654,"48805":22696,"48806":40786,"48807":20754,"48808":20760,"48809":20756,"48810":20752,"48811":20757,"48812":20864,"48813":20906,"48814":20957,"48815":21137,"48816":21139,"48817":21235,"48818":22105,"48819":22123,"48820":22137,"48821":22121,"48822":22116,"48823":22136,"48824":22122,"48825":22120,"48826":22117,"48827":22129,"48828":22127,"48829":22124,"48830":22114,"48831":22134,"48832":22721,"48833":22718,"48834":22727,"48835":22725,"48836":22894,"48837":23325,"48838":23348,"48839":23416,"48840":23536,"48841":23566,"48842":24394,"48843":25010,"48844":24977,"48845":25001,"48846":24970,"48847":25037,"48848":25014,"48849":25022,"48850":25034,"48851":25032,"48852":25136,"48853":25797,"48854":25793,"48855":25803,"48856":25787,"48857":25788,"48858":25818,"48859":25796,"48860":25799,"48861":25794,"48862":25805,"48863":25791,"48864":25810,"48865":25812,"48866":25790,"48867":25972,"48868":26310,"48869":26313,"48870":26297,"48871":26308,"48872":26311,"48873":26296,"48874":27197,"48875":27192,"48876":27194,"48877":27225,"48878":27243,"48879":27224,"48880":27193,"48881":27204,"48882":27234,"48883":27233,"48884":27211,"48885":27207,"48886":27189,"48887":27231,"48888":27208,"48889":27481,"48890":27511,"48891":27653,"48892":28610,"48893":28593,"48894":28577,"48960":28611,"48961":28580,"48962":28609,"48963":28583,"48964":28595,"48965":28608,"48966":28601,"48967":28598,"48968":28582,"48969":28576,"48970":28596,"48971":29118,"48972":29129,"48973":29136,"48974":29138,"48975":29128,"48976":29141,"48977":29113,"48978":29134,"48979":29145,"48980":29148,"48981":29123,"48982":29124,"48983":29544,"48984":29852,"48985":29859,"48986":29848,"48987":29855,"48988":29854,"48989":29922,"48990":29964,"48991":29965,"48992":30260,"48993":30264,"48994":30266,"48995":30439,"48996":30437,"48997":30624,"48998":30622,"48999":30623,"49000":30629,"49001":30952,"49002":30938,"49003":30956,"49004":30951,"49005":31142,"49006":31309,"49007":31310,"49008":31302,"49009":31308,"49010":31307,"49011":31418,"49012":31705,"49013":31761,"49014":31689,"49015":31716,"49016":31707,"49017":31713,"49018":31721,"49019":31718,"49020":31957,"49021":31958,"49022":32266,"49057":32273,"49058":32264,"49059":32283,"49060":32291,"49061":32286,"49062":32285,"49063":32265,"49064":32272,"49065":32633,"49066":32690,"49067":32752,"49068":32753,"49069":32750,"49070":32808,"49071":33203,"49072":33193,"49073":33192,"49074":33275,"49075":33288,"49076":33368,"49077":33369,"49078":34122,"49079":34137,"49080":34120,"49081":34152,"49082":34153,"49083":34115,"49084":34121,"49085":34157,"49086":34154,"49087":34142,"49088":34691,"49089":34719,"49090":34718,"49091":34722,"49092":34701,"49093":34913,"49094":35114,"49095":35122,"49096":35109,"49097":35115,"49098":35105,"49099":35242,"49100":35238,"49101":35558,"49102":35578,"49103":35563,"49104":35569,"49105":35584,"49106":35548,"49107":35559,"49108":35566,"49109":35582,"49110":35585,"49111":35586,"49112":35575,"49113":35565,"49114":35571,"49115":35574,"49116":35580,"49117":35947,"49118":35949,"49119":35987,"49120":36084,"49121":36420,"49122":36401,"49123":36404,"49124":36418,"49125":36409,"49126":36405,"49127":36667,"49128":36655,"49129":36664,"49130":36659,"49131":36776,"49132":36774,"49133":36981,"49134":36980,"49135":36984,"49136":36978,"49137":36988,"49138":36986,"49139":37172,"49140":37266,"49141":37664,"49142":37686,"49143":37624,"49144":37683,"49145":37679,"49146":37666,"49147":37628,"49148":37675,"49149":37636,"49150":37658,"49216":37648,"49217":37670,"49218":37665,"49219":37653,"49220":37678,"49221":37657,"49222":38331,"49223":38567,"49224":38568,"49225":38570,"49226":38613,"49227":38670,"49228":38673,"49229":38678,"49230":38669,"49231":38675,"49232":38671,"49233":38747,"49234":38748,"49235":38758,"49236":38808,"49237":38960,"49238":38968,"49239":38971,"49240":38967,"49241":38957,"49242":38969,"49243":38948,"49244":39184,"49245":39208,"49246":39198,"49247":39195,"49248":39201,"49249":39194,"49250":39405,"49251":39394,"49252":39409,"49253":39608,"49254":39612,"49255":39675,"49256":39661,"49257":39720,"49258":39825,"49259":40213,"49260":40227,"49261":40230,"49262":40232,"49263":40210,"49264":40219,"49265":40664,"49266":40660,"49267":40845,"49268":40860,"49269":20778,"49270":20767,"49271":20769,"49272":20786,"49273":21237,"49274":22158,"49275":22144,"49276":22160,"49277":22149,"49278":22151,"49313":22159,"49314":22741,"49315":22739,"49316":22737,"49317":22734,"49318":23344,"49319":23338,"49320":23332,"49321":23418,"49322":23607,"49323":23656,"49324":23996,"49325":23994,"49326":23997,"49327":23992,"49328":24171,"49329":24396,"49330":24509,"49331":25033,"49332":25026,"49333":25031,"49334":25062,"49335":25035,"49336":25138,"49337":25140,"49338":25806,"49339":25802,"49340":25816,"49341":25824,"49342":25840,"49343":25830,"49344":25836,"49345":25841,"49346":25826,"49347":25837,"49348":25986,"49349":25987,"49350":26329,"49351":26326,"49352":27264,"49353":27284,"49354":27268,"49355":27298,"49356":27292,"49357":27355,"49358":27299,"49359":27262,"49360":27287,"49361":27280,"49362":27296,"49363":27484,"49364":27566,"49365":27610,"49366":27656,"49367":28632,"49368":28657,"49369":28639,"49370":28640,"49371":28635,"49372":28644,"49373":28651,"49374":28655,"49375":28544,"49376":28652,"49377":28641,"49378":28649,"49379":28629,"49380":28654,"49381":28656,"49382":29159,"49383":29151,"49384":29166,"49385":29158,"49386":29157,"49387":29165,"49388":29164,"49389":29172,"49390":29152,"49391":29237,"49392":29254,"49393":29552,"49394":29554,"49395":29865,"49396":29872,"49397":29862,"49398":29864,"49399":30278,"49400":30274,"49401":30284,"49402":30442,"49403":30643,"49404":30634,"49405":30640,"49406":30636,"49472":30631,"49473":30637,"49474":30703,"49475":30967,"49476":30970,"49477":30964,"49478":30959,"49479":30977,"49480":31143,"49481":31146,"49482":31319,"49483":31423,"49484":31751,"49485":31757,"49486":31742,"49487":31735,"49488":31756,"49489":31712,"49490":31968,"49491":31964,"49492":31966,"49493":31970,"49494":31967,"49495":31961,"49496":31965,"49497":32302,"49498":32318,"49499":32326,"49500":32311,"49501":32306,"49502":32323,"49503":32299,"49504":32317,"49505":32305,"49506":32325,"49507":32321,"49508":32308,"49509":32313,"49510":32328,"49511":32309,"49512":32319,"49513":32303,"49514":32580,"49515":32755,"49516":32764,"49517":32881,"49518":32882,"49519":32880,"49520":32879,"49521":32883,"49522":33222,"49523":33219,"49524":33210,"49525":33218,"49526":33216,"49527":33215,"49528":33213,"49529":33225,"49530":33214,"49531":33256,"49532":33289,"49533":33393,"49534":34218,"49569":34180,"49570":34174,"49571":34204,"49572":34193,"49573":34196,"49574":34223,"49575":34203,"49576":34183,"49577":34216,"49578":34186,"49579":34407,"49580":34752,"49581":34769,"49582":34739,"49583":34770,"49584":34758,"49585":34731,"49586":34747,"49587":34746,"49588":34760,"49589":34763,"49590":35131,"49591":35126,"49592":35140,"49593":35128,"49594":35133,"49595":35244,"49596":35598,"49597":35607,"49598":35609,"49599":35611,"49600":35594,"49601":35616,"49602":35613,"49603":35588,"49604":35600,"49605":35905,"49606":35903,"49607":35955,"49608":36090,"49609":36093,"49610":36092,"49611":36088,"49612":36091,"49613":36264,"49614":36425,"49615":36427,"49616":36424,"49617":36426,"49618":36676,"49619":36670,"49620":36674,"49621":36677,"49622":36671,"49623":36991,"49624":36989,"49625":36996,"49626":36993,"49627":36994,"49628":36992,"49629":37177,"49630":37283,"49631":37278,"49632":37276,"49633":37709,"49634":37762,"49635":37672,"49636":37749,"49637":37706,"49638":37733,"49639":37707,"49640":37656,"49641":37758,"49642":37740,"49643":37723,"49644":37744,"49645":37722,"49646":37716,"49647":38346,"49648":38347,"49649":38348,"49650":38344,"49651":38342,"49652":38577,"49653":38584,"49654":38614,"49655":38684,"49656":38686,"49657":38816,"49658":38867,"49659":38982,"49660":39094,"49661":39221,"49662":39425,"49728":39423,"49729":39854,"49730":39851,"49731":39850,"49732":39853,"49733":40251,"49734":40255,"49735":40587,"49736":40655,"49737":40670,"49738":40668,"49739":40669,"49740":40667,"49741":40766,"49742":40779,"49743":21474,"49744":22165,"49745":22190,"49746":22745,"49747":22744,"49748":23352,"49749":24413,"49750":25059,"49751":25139,"49752":25844,"49753":25842,"49754":25854,"49755":25862,"49756":25850,"49757":25851,"49758":25847,"49759":26039,"49760":26332,"49761":26406,"49762":27315,"49763":27308,"49764":27331,"49765":27323,"49766":27320,"49767":27330,"49768":27310,"49769":27311,"49770":27487,"49771":27512,"49772":27567,"49773":28681,"49774":28683,"49775":28670,"49776":28678,"49777":28666,"49778":28689,"49779":28687,"49780":29179,"49781":29180,"49782":29182,"49783":29176,"49784":29559,"49785":29557,"49786":29863,"49787":29887,"49788":29973,"49789":30294,"49790":30296,"49825":30290,"49826":30653,"49827":30655,"49828":30651,"49829":30652,"49830":30990,"49831":31150,"49832":31329,"49833":31330,"49834":31328,"49835":31428,"49836":31429,"49837":31787,"49838":31783,"49839":31786,"49840":31774,"49841":31779,"49842":31777,"49843":31975,"49844":32340,"49845":32341,"49846":32350,"49847":32346,"49848":32353,"49849":32338,"49850":32345,"49851":32584,"49852":32761,"49853":32763,"49854":32887,"49855":32886,"49856":33229,"49857":33231,"49858":33290,"49859":34255,"49860":34217,"49861":34253,"49862":34256,"49863":34249,"49864":34224,"49865":34234,"49866":34233,"49867":34214,"49868":34799,"49869":34796,"49870":34802,"49871":34784,"49872":35206,"49873":35250,"49874":35316,"49875":35624,"49876":35641,"49877":35628,"49878":35627,"49879":35920,"49880":36101,"49881":36441,"49882":36451,"49883":36454,"49884":36452,"49885":36447,"49886":36437,"49887":36544,"49888":36681,"49889":36685,"49890":36999,"49891":36995,"49892":37000,"49893":37291,"49894":37292,"49895":37328,"49896":37780,"49897":37770,"49898":37782,"49899":37794,"49900":37811,"49901":37806,"49902":37804,"49903":37808,"49904":37784,"49905":37786,"49906":37783,"49907":38356,"49908":38358,"49909":38352,"49910":38357,"49911":38626,"49912":38620,"49913":38617,"49914":38619,"49915":38622,"49916":38692,"49917":38819,"49918":38822,"49984":38829,"49985":38905,"49986":38989,"49987":38991,"49988":38988,"49989":38990,"49990":38995,"49991":39098,"49992":39230,"49993":39231,"49994":39229,"49995":39214,"49996":39333,"49997":39438,"49998":39617,"49999":39683,"50000":39686,"50001":39759,"50002":39758,"50003":39757,"50004":39882,"50005":39881,"50006":39933,"50007":39880,"50008":39872,"50009":40273,"50010":40285,"50011":40288,"50012":40672,"50013":40725,"50014":40748,"50015":20787,"50016":22181,"50017":22750,"50018":22751,"50019":22754,"50020":23541,"50021":40848,"50022":24300,"50023":25074,"50024":25079,"50025":25078,"50026":25077,"50027":25856,"50028":25871,"50029":26336,"50030":26333,"50031":27365,"50032":27357,"50033":27354,"50034":27347,"50035":28699,"50036":28703,"50037":28712,"50038":28698,"50039":28701,"50040":28693,"50041":28696,"50042":29190,"50043":29197,"50044":29272,"50045":29346,"50046":29560,"50081":29562,"50082":29885,"50083":29898,"50084":29923,"50085":30087,"50086":30086,"50087":30303,"50088":30305,"50089":30663,"50090":31001,"50091":31153,"50092":31339,"50093":31337,"50094":31806,"50095":31807,"50096":31800,"50097":31805,"50098":31799,"50099":31808,"50100":32363,"50101":32365,"50102":32377,"50103":32361,"50104":32362,"50105":32645,"50106":32371,"50107":32694,"50108":32697,"50109":32696,"50110":33240,"50111":34281,"50112":34269,"50113":34282,"50114":34261,"50115":34276,"50116":34277,"50117":34295,"50118":34811,"50119":34821,"50120":34829,"50121":34809,"50122":34814,"50123":35168,"50124":35167,"50125":35158,"50126":35166,"50127":35649,"50128":35676,"50129":35672,"50130":35657,"50131":35674,"50132":35662,"50133":35663,"50134":35654,"50135":35673,"50136":36104,"50137":36106,"50138":36476,"50139":36466,"50140":36487,"50141":36470,"50142":36460,"50143":36474,"50144":36468,"50145":36692,"50146":36686,"50147":36781,"50148":37002,"50149":37003,"50150":37297,"50151":37294,"50152":37857,"50153":37841,"50154":37855,"50155":37827,"50156":37832,"50157":37852,"50158":37853,"50159":37846,"50160":37858,"50161":37837,"50162":37848,"50163":37860,"50164":37847,"50165":37864,"50166":38364,"50167":38580,"50168":38627,"50169":38698,"50170":38695,"50171":38753,"50172":38876,"50173":38907,"50174":39006,"50240":39000,"50241":39003,"50242":39100,"50243":39237,"50244":39241,"50245":39446,"50246":39449,"50247":39693,"50248":39912,"50249":39911,"50250":39894,"50251":39899,"50252":40329,"50253":40289,"50254":40306,"50255":40298,"50256":40300,"50257":40594,"50258":40599,"50259":40595,"50260":40628,"50261":21240,"50262":22184,"50263":22199,"50264":22198,"50265":22196,"50266":22204,"50267":22756,"50268":23360,"50269":23363,"50270":23421,"50271":23542,"50272":24009,"50273":25080,"50274":25082,"50275":25880,"50276":25876,"50277":25881,"50278":26342,"50279":26407,"50280":27372,"50281":28734,"50282":28720,"50283":28722,"50284":29200,"50285":29563,"50286":29903,"50287":30306,"50288":30309,"50289":31014,"50290":31018,"50291":31020,"50292":31019,"50293":31431,"50294":31478,"50295":31820,"50296":31811,"50297":31821,"50298":31983,"50299":31984,"50300":36782,"50301":32381,"50302":32380,"50337":32386,"50338":32588,"50339":32768,"50340":33242,"50341":33382,"50342":34299,"50343":34297,"50344":34321,"50345":34298,"50346":34310,"50347":34315,"50348":34311,"50349":34314,"50350":34836,"50351":34837,"50352":35172,"50353":35258,"50354":35320,"50355":35696,"50356":35692,"50357":35686,"50358":35695,"50359":35679,"50360":35691,"50361":36111,"50362":36109,"50363":36489,"50364":36481,"50365":36485,"50366":36482,"50367":37300,"50368":37323,"50369":37912,"50370":37891,"50371":37885,"50372":38369,"50373":38704,"50374":39108,"50375":39250,"50376":39249,"50377":39336,"50378":39467,"50379":39472,"50380":39479,"50381":39477,"50382":39955,"50383":39949,"50384":40569,"50385":40629,"50386":40680,"50387":40751,"50388":40799,"50389":40803,"50390":40801,"50391":20791,"50392":20792,"50393":22209,"50394":22208,"50395":22210,"50396":22804,"50397":23660,"50398":24013,"50399":25084,"50400":25086,"50401":25885,"50402":25884,"50403":26005,"50404":26345,"50405":27387,"50406":27396,"50407":27386,"50408":27570,"50409":28748,"50410":29211,"50411":29351,"50412":29910,"50413":29908,"50414":30313,"50415":30675,"50416":31824,"50417":32399,"50418":32396,"50419":32700,"50420":34327,"50421":34349,"50422":34330,"50423":34851,"50424":34850,"50425":34849,"50426":34847,"50427":35178,"50428":35180,"50429":35261,"50430":35700,"50496":35703,"50497":35709,"50498":36115,"50499":36490,"50500":36493,"50501":36491,"50502":36703,"50503":36783,"50504":37306,"50505":37934,"50506":37939,"50507":37941,"50508":37946,"50509":37944,"50510":37938,"50511":37931,"50512":38370,"50513":38712,"50514":38713,"50515":38706,"50516":38911,"50517":39015,"50518":39013,"50519":39255,"50520":39493,"50521":39491,"50522":39488,"50523":39486,"50524":39631,"50525":39764,"50526":39761,"50527":39981,"50528":39973,"50529":40367,"50530":40372,"50531":40386,"50532":40376,"50533":40605,"50534":40687,"50535":40729,"50536":40796,"50537":40806,"50538":40807,"50539":20796,"50540":20795,"50541":22216,"50542":22218,"50543":22217,"50544":23423,"50545":24020,"50546":24018,"50547":24398,"50548":25087,"50549":25892,"50550":27402,"50551":27489,"50552":28753,"50553":28760,"50554":29568,"50555":29924,"50556":30090,"50557":30318,"50558":30316,"50593":31155,"50594":31840,"50595":31839,"50596":32894,"50597":32893,"50598":33247,"50599":35186,"50600":35183,"50601":35324,"50602":35712,"50603":36118,"50604":36119,"50605":36497,"50606":36499,"50607":36705,"50608":37192,"50609":37956,"50610":37969,"50611":37970,"50612":38717,"50613":38718,"50614":38851,"50615":38849,"50616":39019,"50617":39253,"50618":39509,"50619":39501,"50620":39634,"50621":39706,"50622":40009,"50623":39985,"50624":39998,"50625":39995,"50626":40403,"50627":40407,"50628":40756,"50629":40812,"50630":40810,"50631":40852,"50632":22220,"50633":24022,"50634":25088,"50635":25891,"50636":25899,"50637":25898,"50638":26348,"50639":27408,"50640":29914,"50641":31434,"50642":31844,"50643":31843,"50644":31845,"50645":32403,"50646":32406,"50647":32404,"50648":33250,"50649":34360,"50650":34367,"50651":34865,"50652":35722,"50653":37008,"50654":37007,"50655":37987,"50656":37984,"50657":37988,"50658":38760,"50659":39023,"50660":39260,"50661":39514,"50662":39515,"50663":39511,"50664":39635,"50665":39636,"50666":39633,"50667":40020,"50668":40023,"50669":40022,"50670":40421,"50671":40607,"50672":40692,"50673":22225,"50674":22761,"50675":25900,"50676":28766,"50677":30321,"50678":30322,"50679":30679,"50680":32592,"50681":32648,"50682":34870,"50683":34873,"50684":34914,"50685":35731,"50686":35730,"50752":35734,"50753":33399,"50754":36123,"50755":37312,"50756":37994,"50757":38722,"50758":38728,"50759":38724,"50760":38854,"50761":39024,"50762":39519,"50763":39714,"50764":39768,"50765":40031,"50766":40441,"50767":40442,"50768":40572,"50769":40573,"50770":40711,"50771":40823,"50772":40818,"50773":24307,"50774":27414,"50775":28771,"50776":31852,"50777":31854,"50778":34875,"50779":35264,"50780":36513,"50781":37313,"50782":38002,"50783":38000,"50784":39025,"50785":39262,"50786":39638,"50787":39715,"50788":40652,"50789":28772,"50790":30682,"50791":35738,"50792":38007,"50793":38857,"50794":39522,"50795":39525,"50796":32412,"50797":35740,"50798":36522,"50799":37317,"50800":38013,"50801":38014,"50802":38012,"50803":40055,"50804":40056,"50805":40695,"50806":35924,"50807":38015,"50808":40474,"50809":29224,"50810":39530,"50811":39729,"50812":40475,"50813":40478,"50814":31858,"50849":9312,"50850":9313,"50851":9314,"50852":9315,"50853":9316,"50854":9317,"50855":9318,"50856":9319,"50857":9320,"50858":9321,"50859":9332,"50860":9333,"50861":9334,"50862":9335,"50863":9336,"50864":9337,"50865":9338,"50866":9339,"50867":9340,"50868":9341,"50869":8560,"50870":8561,"50871":8562,"50872":8563,"50873":8564,"50874":8565,"50875":8566,"50876":8567,"50877":8568,"50878":8569,"50879":20022,"50880":20031,"50881":20101,"50882":20128,"50883":20866,"50884":20886,"50885":20907,"50886":21241,"50887":21304,"50888":21353,"50889":21430,"50890":22794,"50891":23424,"50892":24027,"50893":24186,"50894":24191,"50895":24308,"50896":24400,"50897":24417,"50898":25908,"50899":26080,"50900":30098,"50901":30326,"50902":36789,"50903":38582,"50904":168,"50905":710,"50906":12541,"50907":12542,"50908":12445,"50909":12446,"50910":12291,"50911":20189,"50912":12293,"50913":12294,"50914":12295,"50915":12540,"50916":65339,"50917":65341,"50918":10045,"50919":12353,"50920":12354,"50921":12355,"50922":12356,"50923":12357,"50924":12358,"50925":12359,"50926":12360,"50927":12361,"50928":12362,"50929":12363,"50930":12364,"50931":12365,"50932":12366,"50933":12367,"50934":12368,"50935":12369,"50936":12370,"50937":12371,"50938":12372,"50939":12373,"50940":12374,"50941":12375,"50942":12376,"51008":12377,"51009":12378,"51010":12379,"51011":12380,"51012":12381,"51013":12382,"51014":12383,"51015":12384,"51016":12385,"51017":12386,"51018":12387,"51019":12388,"51020":12389,"51021":12390,"51022":12391,"51023":12392,"51024":12393,"51025":12394,"51026":12395,"51027":12396,"51028":12397,"51029":12398,"51030":12399,"51031":12400,"51032":12401,"51033":12402,"51034":12403,"51035":12404,"51036":12405,"51037":12406,"51038":12407,"51039":12408,"51040":12409,"51041":12410,"51042":12411,"51043":12412,"51044":12413,"51045":12414,"51046":12415,"51047":12416,"51048":12417,"51049":12418,"51050":12419,"51051":12420,"51052":12421,"51053":12422,"51054":12423,"51055":12424,"51056":12425,"51057":12426,"51058":12427,"51059":12428,"51060":12429,"51061":12430,"51062":12431,"51063":12432,"51064":12433,"51065":12434,"51066":12435,"51067":12449,"51068":12450,"51069":12451,"51070":12452,"51105":12453,"51106":12454,"51107":12455,"51108":12456,"51109":12457,"51110":12458,"51111":12459,"51112":12460,"51113":12461,"51114":12462,"51115":12463,"51116":12464,"51117":12465,"51118":12466,"51119":12467,"51120":12468,"51121":12469,"51122":12470,"51123":12471,"51124":12472,"51125":12473,"51126":12474,"51127":12475,"51128":12476,"51129":12477,"51130":12478,"51131":12479,"51132":12480,"51133":12481,"51134":12482,"51135":12483,"51136":12484,"51137":12485,"51138":12486,"51139":12487,"51140":12488,"51141":12489,"51142":12490,"51143":12491,"51144":12492,"51145":12493,"51146":12494,"51147":12495,"51148":12496,"51149":12497,"51150":12498,"51151":12499,"51152":12500,"51153":12501,"51154":12502,"51155":12503,"51156":12504,"51157":12505,"51158":12506,"51159":12507,"51160":12508,"51161":12509,"51162":12510,"51163":12511,"51164":12512,"51165":12513,"51166":12514,"51167":12515,"51168":12516,"51169":12517,"51170":12518,"51171":12519,"51172":12520,"51173":12521,"51174":12522,"51175":12523,"51176":12524,"51177":12525,"51178":12526,"51179":12527,"51180":12528,"51181":12529,"51182":12530,"51183":12531,"51184":12532,"51185":12533,"51186":12534,"51187":1040,"51188":1041,"51189":1042,"51190":1043,"51191":1044,"51192":1045,"51193":1025,"51194":1046,"51195":1047,"51196":1048,"51197":1049,"51198":1050,"51264":1051,"51265":1052,"51266":1053,"51267":1054,"51268":1055,"51269":1056,"51270":1057,"51271":1058,"51272":1059,"51273":1060,"51274":1061,"51275":1062,"51276":1063,"51277":1064,"51278":1065,"51279":1066,"51280":1067,"51281":1068,"51282":1069,"51283":1070,"51284":1071,"51285":1072,"51286":1073,"51287":1074,"51288":1075,"51289":1076,"51290":1077,"51291":1105,"51292":1078,"51293":1079,"51294":1080,"51295":1081,"51296":1082,"51297":1083,"51298":1084,"51299":1085,"51300":1086,"51301":1087,"51302":1088,"51303":1089,"51304":1090,"51305":1091,"51306":1092,"51307":1093,"51308":1094,"51309":1095,"51310":1096,"51311":1097,"51312":1098,"51313":1099,"51314":1100,"51315":1101,"51316":1102,"51317":1103,"51318":8679,"51319":8632,"51320":8633,"51321":12751,"51322":63462,"51323":20058,"51324":63464,"51325":20994,"51326":17553,"51361":40880,"51362":20872,"51363":40881,"51364":63470,"51365":63471,"51366":63472,"51367":63473,"51368":63474,"51369":63475,"51370":63476,"51371":63477,"51372":63478,"51373":63479,"51374":63480,"51375":63481,"51376":63482,"51377":12443,"51378":12444,"51379":12436,"51380":12535,"51381":12536,"51382":12537,"51383":12538,"51384":12539,"51385":65377,"51386":65378,"51387":65379,"51388":65380,"51389":65381,"51390":65382,"51391":65383,"51392":65384,"51393":65385,"51394":65386,"51395":65387,"51396":65388,"51397":65389,"51398":65390,"51399":65391,"51400":65392,"51401":65393,"51402":65394,"51403":65395,"51404":65396,"51405":65506,"51406":65508,"51407":65287,"51408":65282,"51409":12849,"51410":8470,"51411":8481,"51412":65397,"51413":65398,"51414":65399,"51415":65400,"51416":65401,"51417":65402,"51418":65403,"51419":65404,"51420":65405,"51421":65406,"51422":65407,"51423":65408,"51424":65409,"51425":65410,"51426":65411,"51427":65412,"51428":65413,"51429":65414,"51430":65415,"51431":65416,"51432":65417,"51433":65418,"51434":65419,"51435":65420,"51436":65421,"51437":65422,"51438":65423,"51439":65424,"51440":65425,"51441":65426,"51442":65427,"51443":65428,"51444":65429,"51445":65430,"51446":65431,"51447":65432,"51448":65433,"51449":65434,"51450":65435,"51451":65436,"51452":65437,"51453":65438,"51454":65439,"51520":20034,"51521":20060,"51522":20981,"51523":21274,"51524":21378,"51525":19975,"51526":19980,"51527":20039,"51528":20109,"51529":22231,"51530":64012,"51531":23662,"51532":24435,"51533":19983,"51534":20871,"51535":19982,"51536":20014,"51537":20115,"51538":20162,"51539":20169,"51540":20168,"51541":20888,"51542":21244,"51543":21356,"51544":21433,"51545":22304,"51546":22787,"51547":22828,"51548":23568,"51549":24063,"51550":26081,"51551":27571,"51552":27596,"51553":27668,"51554":29247,"51555":20017,"51556":20028,"51557":20200,"51558":20188,"51559":20201,"51560":20193,"51561":20189,"51562":20186,"51563":21004,"51564":21276,"51565":21324,"51566":22306,"51567":22307,"51568":22807,"51569":22831,"51570":23425,"51571":23428,"51572":23570,"51573":23611,"51574":23668,"51575":23667,"51576":24068,"51577":24192,"51578":24194,"51579":24521,"51580":25097,"51581":25168,"51582":27669,"51617":27702,"51618":27715,"51619":27711,"51620":27707,"51621":29358,"51622":29360,"51623":29578,"51624":31160,"51625":32906,"51626":38430,"51627":20238,"51628":20248,"51629":20268,"51630":20213,"51631":20244,"51632":20209,"51633":20224,"51634":20215,"51635":20232,"51636":20253,"51637":20226,"51638":20229,"51639":20258,"51640":20243,"51641":20228,"51642":20212,"51643":20242,"51644":20913,"51645":21011,"51646":21001,"51647":21008,"51648":21158,"51649":21282,"51650":21279,"51651":21325,"51652":21386,"51653":21511,"51654":22241,"51655":22239,"51656":22318,"51657":22314,"51658":22324,"51659":22844,"51660":22912,"51661":22908,"51662":22917,"51663":22907,"51664":22910,"51665":22903,"51666":22911,"51667":23382,"51668":23573,"51669":23589,"51670":23676,"51671":23674,"51672":23675,"51673":23678,"51674":24031,"51675":24181,"51676":24196,"51677":24322,"51678":24346,"51679":24436,"51680":24533,"51681":24532,"51682":24527,"51683":25180,"51684":25182,"51685":25188,"51686":25185,"51687":25190,"51688":25186,"51689":25177,"51690":25184,"51691":25178,"51692":25189,"51693":26095,"51694":26094,"51695":26430,"51696":26425,"51697":26424,"51698":26427,"51699":26426,"51700":26431,"51701":26428,"51702":26419,"51703":27672,"51704":27718,"51705":27730,"51706":27740,"51707":27727,"51708":27722,"51709":27732,"51710":27723,"51776":27724,"51777":28785,"51778":29278,"51779":29364,"51780":29365,"51781":29582,"51782":29994,"51783":30335,"51784":31349,"51785":32593,"51786":33400,"51787":33404,"51788":33408,"51789":33405,"51790":33407,"51791":34381,"51792":35198,"51793":37017,"51794":37015,"51795":37016,"51796":37019,"51797":37012,"51798":38434,"51799":38436,"51800":38432,"51801":38435,"51802":20310,"51803":20283,"51804":20322,"51805":20297,"51806":20307,"51807":20324,"51808":20286,"51809":20327,"51810":20306,"51811":20319,"51812":20289,"51813":20312,"51814":20269,"51815":20275,"51816":20287,"51817":20321,"51818":20879,"51819":20921,"51820":21020,"51821":21022,"51822":21025,"51823":21165,"51824":21166,"51825":21257,"51826":21347,"51827":21362,"51828":21390,"51829":21391,"51830":21552,"51831":21559,"51832":21546,"51833":21588,"51834":21573,"51835":21529,"51836":21532,"51837":21541,"51838":21528,"51873":21565,"51874":21583,"51875":21569,"51876":21544,"51877":21540,"51878":21575,"51879":22254,"51880":22247,"51881":22245,"51882":22337,"51883":22341,"51884":22348,"51885":22345,"51886":22347,"51887":22354,"51888":22790,"51889":22848,"51890":22950,"51891":22936,"51892":22944,"51893":22935,"51894":22926,"51895":22946,"51896":22928,"51897":22927,"51898":22951,"51899":22945,"51900":23438,"51901":23442,"51902":23592,"51903":23594,"51904":23693,"51905":23695,"51906":23688,"51907":23691,"51908":23689,"51909":23698,"51910":23690,"51911":23686,"51912":23699,"51913":23701,"51914":24032,"51915":24074,"51916":24078,"51917":24203,"51918":24201,"51919":24204,"51920":24200,"51921":24205,"51922":24325,"51923":24349,"51924":24440,"51925":24438,"51926":24530,"51927":24529,"51928":24528,"51929":24557,"51930":24552,"51931":24558,"51932":24563,"51933":24545,"51934":24548,"51935":24547,"51936":24570,"51937":24559,"51938":24567,"51939":24571,"51940":24576,"51941":24564,"51942":25146,"51943":25219,"51944":25228,"51945":25230,"51946":25231,"51947":25236,"51948":25223,"51949":25201,"51950":25211,"51951":25210,"51952":25200,"51953":25217,"51954":25224,"51955":25207,"51956":25213,"51957":25202,"51958":25204,"51959":25911,"51960":26096,"51961":26100,"51962":26099,"51963":26098,"51964":26101,"51965":26437,"51966":26439,"52032":26457,"52033":26453,"52034":26444,"52035":26440,"52036":26461,"52037":26445,"52038":26458,"52039":26443,"52040":27600,"52041":27673,"52042":27674,"52043":27768,"52044":27751,"52045":27755,"52046":27780,"52047":27787,"52048":27791,"52049":27761,"52050":27759,"52051":27753,"52052":27802,"52053":27757,"52054":27783,"52055":27797,"52056":27804,"52057":27750,"52058":27763,"52059":27749,"52060":27771,"52061":27790,"52062":28788,"52063":28794,"52064":29283,"52065":29375,"52066":29373,"52067":29379,"52068":29382,"52069":29377,"52070":29370,"52071":29381,"52072":29589,"52073":29591,"52074":29587,"52075":29588,"52076":29586,"52077":30010,"52078":30009,"52079":30100,"52080":30101,"52081":30337,"52082":31037,"52083":32820,"52084":32917,"52085":32921,"52086":32912,"52087":32914,"52088":32924,"52089":33424,"52090":33423,"52091":33413,"52092":33422,"52093":33425,"52094":33427,"52129":33418,"52130":33411,"52131":33412,"52132":35960,"52133":36809,"52134":36799,"52135":37023,"52136":37025,"52137":37029,"52138":37022,"52139":37031,"52140":37024,"52141":38448,"52142":38440,"52143":38447,"52144":38445,"52145":20019,"52146":20376,"52147":20348,"52148":20357,"52149":20349,"52150":20352,"52151":20359,"52152":20342,"52153":20340,"52154":20361,"52155":20356,"52156":20343,"52157":20300,"52158":20375,"52159":20330,"52160":20378,"52161":20345,"52162":20353,"52163":20344,"52164":20368,"52165":20380,"52166":20372,"52167":20382,"52168":20370,"52169":20354,"52170":20373,"52171":20331,"52172":20334,"52173":20894,"52174":20924,"52175":20926,"52176":21045,"52177":21042,"52178":21043,"52179":21062,"52180":21041,"52181":21180,"52182":21258,"52183":21259,"52184":21308,"52185":21394,"52186":21396,"52187":21639,"52188":21631,"52189":21633,"52190":21649,"52191":21634,"52192":21640,"52193":21611,"52194":21626,"52195":21630,"52196":21605,"52197":21612,"52198":21620,"52199":21606,"52200":21645,"52201":21615,"52202":21601,"52203":21600,"52204":21656,"52205":21603,"52206":21607,"52207":21604,"52208":22263,"52209":22265,"52210":22383,"52211":22386,"52212":22381,"52213":22379,"52214":22385,"52215":22384,"52216":22390,"52217":22400,"52218":22389,"52219":22395,"52220":22387,"52221":22388,"52222":22370,"52288":22376,"52289":22397,"52290":22796,"52291":22853,"52292":22965,"52293":22970,"52294":22991,"52295":22990,"52296":22962,"52297":22988,"52298":22977,"52299":22966,"52300":22972,"52301":22979,"52302":22998,"52303":22961,"52304":22973,"52305":22976,"52306":22984,"52307":22964,"52308":22983,"52309":23394,"52310":23397,"52311":23443,"52312":23445,"52313":23620,"52314":23623,"52315":23726,"52316":23716,"52317":23712,"52318":23733,"52319":23727,"52320":23720,"52321":23724,"52322":23711,"52323":23715,"52324":23725,"52325":23714,"52326":23722,"52327":23719,"52328":23709,"52329":23717,"52330":23734,"52331":23728,"52332":23718,"52333":24087,"52334":24084,"52335":24089,"52336":24360,"52337":24354,"52338":24355,"52339":24356,"52340":24404,"52341":24450,"52342":24446,"52343":24445,"52344":24542,"52345":24549,"52346":24621,"52347":24614,"52348":24601,"52349":24626,"52350":24587,"52385":24628,"52386":24586,"52387":24599,"52388":24627,"52389":24602,"52390":24606,"52391":24620,"52392":24610,"52393":24589,"52394":24592,"52395":24622,"52396":24595,"52397":24593,"52398":24588,"52399":24585,"52400":24604,"52401":25108,"52402":25149,"52403":25261,"52404":25268,"52405":25297,"52406":25278,"52407":25258,"52408":25270,"52409":25290,"52410":25262,"52411":25267,"52412":25263,"52413":25275,"52414":25257,"52415":25264,"52416":25272,"52417":25917,"52418":26024,"52419":26043,"52420":26121,"52421":26108,"52422":26116,"52423":26130,"52424":26120,"52425":26107,"52426":26115,"52427":26123,"52428":26125,"52429":26117,"52430":26109,"52431":26129,"52432":26128,"52433":26358,"52434":26378,"52435":26501,"52436":26476,"52437":26510,"52438":26514,"52439":26486,"52440":26491,"52441":26520,"52442":26502,"52443":26500,"52444":26484,"52445":26509,"52446":26508,"52447":26490,"52448":26527,"52449":26513,"52450":26521,"52451":26499,"52452":26493,"52453":26497,"52454":26488,"52455":26489,"52456":26516,"52457":27429,"52458":27520,"52459":27518,"52460":27614,"52461":27677,"52462":27795,"52463":27884,"52464":27883,"52465":27886,"52466":27865,"52467":27830,"52468":27860,"52469":27821,"52470":27879,"52471":27831,"52472":27856,"52473":27842,"52474":27834,"52475":27843,"52476":27846,"52477":27885,"52478":27890,"52544":27858,"52545":27869,"52546":27828,"52547":27786,"52548":27805,"52549":27776,"52550":27870,"52551":27840,"52552":27952,"52553":27853,"52554":27847,"52555":27824,"52556":27897,"52557":27855,"52558":27881,"52559":27857,"52560":28820,"52561":28824,"52562":28805,"52563":28819,"52564":28806,"52565":28804,"52566":28817,"52567":28822,"52568":28802,"52569":28826,"52570":28803,"52571":29290,"52572":29398,"52573":29387,"52574":29400,"52575":29385,"52576":29404,"52577":29394,"52578":29396,"52579":29402,"52580":29388,"52581":29393,"52582":29604,"52583":29601,"52584":29613,"52585":29606,"52586":29602,"52587":29600,"52588":29612,"52589":29597,"52590":29917,"52591":29928,"52592":30015,"52593":30016,"52594":30014,"52595":30092,"52596":30104,"52597":30383,"52598":30451,"52599":30449,"52600":30448,"52601":30453,"52602":30712,"52603":30716,"52604":30713,"52605":30715,"52606":30714,"52641":30711,"52642":31042,"52643":31039,"52644":31173,"52645":31352,"52646":31355,"52647":31483,"52648":31861,"52649":31997,"52650":32821,"52651":32911,"52652":32942,"52653":32931,"52654":32952,"52655":32949,"52656":32941,"52657":33312,"52658":33440,"52659":33472,"52660":33451,"52661":33434,"52662":33432,"52663":33435,"52664":33461,"52665":33447,"52666":33454,"52667":33468,"52668":33438,"52669":33466,"52670":33460,"52671":33448,"52672":33441,"52673":33449,"52674":33474,"52675":33444,"52676":33475,"52677":33462,"52678":33442,"52679":34416,"52680":34415,"52681":34413,"52682":34414,"52683":35926,"52684":36818,"52685":36811,"52686":36819,"52687":36813,"52688":36822,"52689":36821,"52690":36823,"52691":37042,"52692":37044,"52693":37039,"52694":37043,"52695":37040,"52696":38457,"52697":38461,"52698":38460,"52699":38458,"52700":38467,"52701":20429,"52702":20421,"52703":20435,"52704":20402,"52705":20425,"52706":20427,"52707":20417,"52708":20436,"52709":20444,"52710":20441,"52711":20411,"52712":20403,"52713":20443,"52714":20423,"52715":20438,"52716":20410,"52717":20416,"52718":20409,"52719":20460,"52720":21060,"52721":21065,"52722":21184,"52723":21186,"52724":21309,"52725":21372,"52726":21399,"52727":21398,"52728":21401,"52729":21400,"52730":21690,"52731":21665,"52732":21677,"52733":21669,"52734":21711,"52800":21699,"52801":33549,"52802":21687,"52803":21678,"52804":21718,"52805":21686,"52806":21701,"52807":21702,"52808":21664,"52809":21616,"52810":21692,"52811":21666,"52812":21694,"52813":21618,"52814":21726,"52815":21680,"52816":22453,"52817":22430,"52818":22431,"52819":22436,"52820":22412,"52821":22423,"52822":22429,"52823":22427,"52824":22420,"52825":22424,"52826":22415,"52827":22425,"52828":22437,"52829":22426,"52830":22421,"52831":22772,"52832":22797,"52833":22867,"52834":23009,"52835":23006,"52836":23022,"52837":23040,"52838":23025,"52839":23005,"52840":23034,"52841":23037,"52842":23036,"52843":23030,"52844":23012,"52845":23026,"52846":23031,"52847":23003,"52848":23017,"52849":23027,"52850":23029,"52851":23008,"52852":23038,"52853":23028,"52854":23021,"52855":23464,"52856":23628,"52857":23760,"52858":23768,"52859":23756,"52860":23767,"52861":23755,"52862":23771,"52897":23774,"52898":23770,"52899":23753,"52900":23751,"52901":23754,"52902":23766,"52903":23763,"52904":23764,"52905":23759,"52906":23752,"52907":23750,"52908":23758,"52909":23775,"52910":23800,"52911":24057,"52912":24097,"52913":24098,"52914":24099,"52915":24096,"52916":24100,"52917":24240,"52918":24228,"52919":24226,"52920":24219,"52921":24227,"52922":24229,"52923":24327,"52924":24366,"52925":24406,"52926":24454,"52927":24631,"52928":24633,"52929":24660,"52930":24690,"52931":24670,"52932":24645,"52933":24659,"52934":24647,"52935":24649,"52936":24667,"52937":24652,"52938":24640,"52939":24642,"52940":24671,"52941":24612,"52942":24644,"52943":24664,"52944":24678,"52945":24686,"52946":25154,"52947":25155,"52948":25295,"52949":25357,"52950":25355,"52951":25333,"52952":25358,"52953":25347,"52954":25323,"52955":25337,"52956":25359,"52957":25356,"52958":25336,"52959":25334,"52960":25344,"52961":25363,"52962":25364,"52963":25338,"52964":25365,"52965":25339,"52966":25328,"52967":25921,"52968":25923,"52969":26026,"52970":26047,"52971":26166,"52972":26145,"52973":26162,"52974":26165,"52975":26140,"52976":26150,"52977":26146,"52978":26163,"52979":26155,"52980":26170,"52981":26141,"52982":26164,"52983":26169,"52984":26158,"52985":26383,"52986":26384,"52987":26561,"52988":26610,"52989":26568,"52990":26554,"53056":26588,"53057":26555,"53058":26616,"53059":26584,"53060":26560,"53061":26551,"53062":26565,"53063":26603,"53064":26596,"53065":26591,"53066":26549,"53067":26573,"53068":26547,"53069":26615,"53070":26614,"53071":26606,"53072":26595,"53073":26562,"53074":26553,"53075":26574,"53076":26599,"53077":26608,"53078":26546,"53079":26620,"53080":26566,"53081":26605,"53082":26572,"53083":26542,"53084":26598,"53085":26587,"53086":26618,"53087":26569,"53088":26570,"53089":26563,"53090":26602,"53091":26571,"53092":27432,"53093":27522,"53094":27524,"53095":27574,"53096":27606,"53097":27608,"53098":27616,"53099":27680,"53100":27681,"53101":27944,"53102":27956,"53103":27949,"53104":27935,"53105":27964,"53106":27967,"53107":27922,"53108":27914,"53109":27866,"53110":27955,"53111":27908,"53112":27929,"53113":27962,"53114":27930,"53115":27921,"53116":27904,"53117":27933,"53118":27970,"53153":27905,"53154":27928,"53155":27959,"53156":27907,"53157":27919,"53158":27968,"53159":27911,"53160":27936,"53161":27948,"53162":27912,"53163":27938,"53164":27913,"53165":27920,"53166":28855,"53167":28831,"53168":28862,"53169":28849,"53170":28848,"53171":28833,"53172":28852,"53173":28853,"53174":28841,"53175":29249,"53176":29257,"53177":29258,"53178":29292,"53179":29296,"53180":29299,"53181":29294,"53182":29386,"53183":29412,"53184":29416,"53185":29419,"53186":29407,"53187":29418,"53188":29414,"53189":29411,"53190":29573,"53191":29644,"53192":29634,"53193":29640,"53194":29637,"53195":29625,"53196":29622,"53197":29621,"53198":29620,"53199":29675,"53200":29631,"53201":29639,"53202":29630,"53203":29635,"53204":29638,"53205":29624,"53206":29643,"53207":29932,"53208":29934,"53209":29998,"53210":30023,"53211":30024,"53212":30119,"53213":30122,"53214":30329,"53215":30404,"53216":30472,"53217":30467,"53218":30468,"53219":30469,"53220":30474,"53221":30455,"53222":30459,"53223":30458,"53224":30695,"53225":30696,"53226":30726,"53227":30737,"53228":30738,"53229":30725,"53230":30736,"53231":30735,"53232":30734,"53233":30729,"53234":30723,"53235":30739,"53236":31050,"53237":31052,"53238":31051,"53239":31045,"53240":31044,"53241":31189,"53242":31181,"53243":31183,"53244":31190,"53245":31182,"53246":31360,"53312":31358,"53313":31441,"53314":31488,"53315":31489,"53316":31866,"53317":31864,"53318":31865,"53319":31871,"53320":31872,"53321":31873,"53322":32003,"53323":32008,"53324":32001,"53325":32600,"53326":32657,"53327":32653,"53328":32702,"53329":32775,"53330":32782,"53331":32783,"53332":32788,"53333":32823,"53334":32984,"53335":32967,"53336":32992,"53337":32977,"53338":32968,"53339":32962,"53340":32976,"53341":32965,"53342":32995,"53343":32985,"53344":32988,"53345":32970,"53346":32981,"53347":32969,"53348":32975,"53349":32983,"53350":32998,"53351":32973,"53352":33279,"53353":33313,"53354":33428,"53355":33497,"53356":33534,"53357":33529,"53358":33543,"53359":33512,"53360":33536,"53361":33493,"53362":33594,"53363":33515,"53364":33494,"53365":33524,"53366":33516,"53367":33505,"53368":33522,"53369":33525,"53370":33548,"53371":33531,"53372":33526,"53373":33520,"53374":33514,"53409":33508,"53410":33504,"53411":33530,"53412":33523,"53413":33517,"53414":34423,"53415":34420,"53416":34428,"53417":34419,"53418":34881,"53419":34894,"53420":34919,"53421":34922,"53422":34921,"53423":35283,"53424":35332,"53425":35335,"53426":36210,"53427":36835,"53428":36833,"53429":36846,"53430":36832,"53431":37105,"53432":37053,"53433":37055,"53434":37077,"53435":37061,"53436":37054,"53437":37063,"53438":37067,"53439":37064,"53440":37332,"53441":37331,"53442":38484,"53443":38479,"53444":38481,"53445":38483,"53446":38474,"53447":38478,"53448":20510,"53449":20485,"53450":20487,"53451":20499,"53452":20514,"53453":20528,"53454":20507,"53455":20469,"53456":20468,"53457":20531,"53458":20535,"53459":20524,"53460":20470,"53461":20471,"53462":20503,"53463":20508,"53464":20512,"53465":20519,"53466":20533,"53467":20527,"53468":20529,"53469":20494,"53470":20826,"53471":20884,"53472":20883,"53473":20938,"53474":20932,"53475":20933,"53476":20936,"53477":20942,"53478":21089,"53479":21082,"53480":21074,"53481":21086,"53482":21087,"53483":21077,"53484":21090,"53485":21197,"53486":21262,"53487":21406,"53488":21798,"53489":21730,"53490":21783,"53491":21778,"53492":21735,"53493":21747,"53494":21732,"53495":21786,"53496":21759,"53497":21764,"53498":21768,"53499":21739,"53500":21777,"53501":21765,"53502":21745,"53568":21770,"53569":21755,"53570":21751,"53571":21752,"53572":21728,"53573":21774,"53574":21763,"53575":21771,"53576":22273,"53577":22274,"53578":22476,"53579":22578,"53580":22485,"53581":22482,"53582":22458,"53583":22470,"53584":22461,"53585":22460,"53586":22456,"53587":22454,"53588":22463,"53589":22471,"53590":22480,"53591":22457,"53592":22465,"53593":22798,"53594":22858,"53595":23065,"53596":23062,"53597":23085,"53598":23086,"53599":23061,"53600":23055,"53601":23063,"53602":23050,"53603":23070,"53604":23091,"53605":23404,"53606":23463,"53607":23469,"53608":23468,"53609":23555,"53610":23638,"53611":23636,"53612":23788,"53613":23807,"53614":23790,"53615":23793,"53616":23799,"53617":23808,"53618":23801,"53619":24105,"53620":24104,"53621":24232,"53622":24238,"53623":24234,"53624":24236,"53625":24371,"53626":24368,"53627":24423,"53628":24669,"53629":24666,"53630":24679,"53665":24641,"53666":24738,"53667":24712,"53668":24704,"53669":24722,"53670":24705,"53671":24733,"53672":24707,"53673":24725,"53674":24731,"53675":24727,"53676":24711,"53677":24732,"53678":24718,"53679":25113,"53680":25158,"53681":25330,"53682":25360,"53683":25430,"53684":25388,"53685":25412,"53686":25413,"53687":25398,"53688":25411,"53689":25572,"53690":25401,"53691":25419,"53692":25418,"53693":25404,"53694":25385,"53695":25409,"53696":25396,"53697":25432,"53698":25428,"53699":25433,"53700":25389,"53701":25415,"53702":25395,"53703":25434,"53704":25425,"53705":25400,"53706":25431,"53707":25408,"53708":25416,"53709":25930,"53710":25926,"53711":26054,"53712":26051,"53713":26052,"53714":26050,"53715":26186,"53716":26207,"53717":26183,"53718":26193,"53719":26386,"53720":26387,"53721":26655,"53722":26650,"53723":26697,"53724":26674,"53725":26675,"53726":26683,"53727":26699,"53728":26703,"53729":26646,"53730":26673,"53731":26652,"53732":26677,"53733":26667,"53734":26669,"53735":26671,"53736":26702,"53737":26692,"53738":26676,"53739":26653,"53740":26642,"53741":26644,"53742":26662,"53743":26664,"53744":26670,"53745":26701,"53746":26682,"53747":26661,"53748":26656,"53749":27436,"53750":27439,"53751":27437,"53752":27441,"53753":27444,"53754":27501,"53755":32898,"53756":27528,"53757":27622,"53758":27620,"53824":27624,"53825":27619,"53826":27618,"53827":27623,"53828":27685,"53829":28026,"53830":28003,"53831":28004,"53832":28022,"53833":27917,"53834":28001,"53835":28050,"53836":27992,"53837":28002,"53838":28013,"53839":28015,"53840":28049,"53841":28045,"53842":28143,"53843":28031,"53844":28038,"53845":27998,"53846":28007,"53847":28000,"53848":28055,"53849":28016,"53850":28028,"53851":27999,"53852":28034,"53853":28056,"53854":27951,"53855":28008,"53856":28043,"53857":28030,"53858":28032,"53859":28036,"53860":27926,"53861":28035,"53862":28027,"53863":28029,"53864":28021,"53865":28048,"53866":28892,"53867":28883,"53868":28881,"53869":28893,"53870":28875,"53871":32569,"53872":28898,"53873":28887,"53874":28882,"53875":28894,"53876":28896,"53877":28884,"53878":28877,"53879":28869,"53880":28870,"53881":28871,"53882":28890,"53883":28878,"53884":28897,"53885":29250,"53886":29304,"53921":29303,"53922":29302,"53923":29440,"53924":29434,"53925":29428,"53926":29438,"53927":29430,"53928":29427,"53929":29435,"53930":29441,"53931":29651,"53932":29657,"53933":29669,"53934":29654,"53935":29628,"53936":29671,"53937":29667,"53938":29673,"53939":29660,"53940":29650,"53941":29659,"53942":29652,"53943":29661,"53944":29658,"53945":29655,"53946":29656,"53947":29672,"53948":29918,"53949":29919,"53950":29940,"53951":29941,"53952":29985,"53953":30043,"53954":30047,"53955":30128,"53956":30145,"53957":30139,"53958":30148,"53959":30144,"53960":30143,"53961":30134,"53962":30138,"53963":30346,"53964":30409,"53965":30493,"53966":30491,"53967":30480,"53968":30483,"53969":30482,"53970":30499,"53971":30481,"53972":30485,"53973":30489,"53974":30490,"53975":30498,"53976":30503,"53977":30755,"53978":30764,"53979":30754,"53980":30773,"53981":30767,"53982":30760,"53983":30766,"53984":30763,"53985":30753,"53986":30761,"53987":30771,"53988":30762,"53989":30769,"53990":31060,"53991":31067,"53992":31055,"53993":31068,"53994":31059,"53995":31058,"53996":31057,"53997":31211,"53998":31212,"53999":31200,"54000":31214,"54001":31213,"54002":31210,"54003":31196,"54004":31198,"54005":31197,"54006":31366,"54007":31369,"54008":31365,"54009":31371,"54010":31372,"54011":31370,"54012":31367,"54013":31448,"54014":31504,"54080":31492,"54081":31507,"54082":31493,"54083":31503,"54084":31496,"54085":31498,"54086":31502,"54087":31497,"54088":31506,"54089":31876,"54090":31889,"54091":31882,"54092":31884,"54093":31880,"54094":31885,"54095":31877,"54096":32030,"54097":32029,"54098":32017,"54099":32014,"54100":32024,"54101":32022,"54102":32019,"54103":32031,"54104":32018,"54105":32015,"54106":32012,"54107":32604,"54108":32609,"54109":32606,"54110":32608,"54111":32605,"54112":32603,"54113":32662,"54114":32658,"54115":32707,"54116":32706,"54117":32704,"54118":32790,"54119":32830,"54120":32825,"54121":33018,"54122":33010,"54123":33017,"54124":33013,"54125":33025,"54126":33019,"54127":33024,"54128":33281,"54129":33327,"54130":33317,"54131":33587,"54132":33581,"54133":33604,"54134":33561,"54135":33617,"54136":33573,"54137":33622,"54138":33599,"54139":33601,"54140":33574,"54141":33564,"54142":33570,"54177":33602,"54178":33614,"54179":33563,"54180":33578,"54181":33544,"54182":33596,"54183":33613,"54184":33558,"54185":33572,"54186":33568,"54187":33591,"54188":33583,"54189":33577,"54190":33607,"54191":33605,"54192":33612,"54193":33619,"54194":33566,"54195":33580,"54196":33611,"54197":33575,"54198":33608,"54199":34387,"54200":34386,"54201":34466,"54202":34472,"54203":34454,"54204":34445,"54205":34449,"54206":34462,"54207":34439,"54208":34455,"54209":34438,"54210":34443,"54211":34458,"54212":34437,"54213":34469,"54214":34457,"54215":34465,"54216":34471,"54217":34453,"54218":34456,"54219":34446,"54220":34461,"54221":34448,"54222":34452,"54223":34883,"54224":34884,"54225":34925,"54226":34933,"54227":34934,"54228":34930,"54229":34944,"54230":34929,"54231":34943,"54232":34927,"54233":34947,"54234":34942,"54235":34932,"54236":34940,"54237":35346,"54238":35911,"54239":35927,"54240":35963,"54241":36004,"54242":36003,"54243":36214,"54244":36216,"54245":36277,"54246":36279,"54247":36278,"54248":36561,"54249":36563,"54250":36862,"54251":36853,"54252":36866,"54253":36863,"54254":36859,"54255":36868,"54256":36860,"54257":36854,"54258":37078,"54259":37088,"54260":37081,"54261":37082,"54262":37091,"54263":37087,"54264":37093,"54265":37080,"54266":37083,"54267":37079,"54268":37084,"54269":37092,"54270":37200,"54336":37198,"54337":37199,"54338":37333,"54339":37346,"54340":37338,"54341":38492,"54342":38495,"54343":38588,"54344":39139,"54345":39647,"54346":39727,"54347":20095,"54348":20592,"54349":20586,"54350":20577,"54351":20574,"54352":20576,"54353":20563,"54354":20555,"54355":20573,"54356":20594,"54357":20552,"54358":20557,"54359":20545,"54360":20571,"54361":20554,"54362":20578,"54363":20501,"54364":20549,"54365":20575,"54366":20585,"54367":20587,"54368":20579,"54369":20580,"54370":20550,"54371":20544,"54372":20590,"54373":20595,"54374":20567,"54375":20561,"54376":20944,"54377":21099,"54378":21101,"54379":21100,"54380":21102,"54381":21206,"54382":21203,"54383":21293,"54384":21404,"54385":21877,"54386":21878,"54387":21820,"54388":21837,"54389":21840,"54390":21812,"54391":21802,"54392":21841,"54393":21858,"54394":21814,"54395":21813,"54396":21808,"54397":21842,"54398":21829,"54433":21772,"54434":21810,"54435":21861,"54436":21838,"54437":21817,"54438":21832,"54439":21805,"54440":21819,"54441":21824,"54442":21835,"54443":22282,"54444":22279,"54445":22523,"54446":22548,"54447":22498,"54448":22518,"54449":22492,"54450":22516,"54451":22528,"54452":22509,"54453":22525,"54454":22536,"54455":22520,"54456":22539,"54457":22515,"54458":22479,"54459":22535,"54460":22510,"54461":22499,"54462":22514,"54463":22501,"54464":22508,"54465":22497,"54466":22542,"54467":22524,"54468":22544,"54469":22503,"54470":22529,"54471":22540,"54472":22513,"54473":22505,"54474":22512,"54475":22541,"54476":22532,"54477":22876,"54478":23136,"54479":23128,"54480":23125,"54481":23143,"54482":23134,"54483":23096,"54484":23093,"54485":23149,"54486":23120,"54487":23135,"54488":23141,"54489":23148,"54490":23123,"54491":23140,"54492":23127,"54493":23107,"54494":23133,"54495":23122,"54496":23108,"54497":23131,"54498":23112,"54499":23182,"54500":23102,"54501":23117,"54502":23097,"54503":23116,"54504":23152,"54505":23145,"54506":23111,"54507":23121,"54508":23126,"54509":23106,"54510":23132,"54511":23410,"54512":23406,"54513":23489,"54514":23488,"54515":23641,"54516":23838,"54517":23819,"54518":23837,"54519":23834,"54520":23840,"54521":23820,"54522":23848,"54523":23821,"54524":23846,"54525":23845,"54526":23823,"54592":23856,"54593":23826,"54594":23843,"54595":23839,"54596":23854,"54597":24126,"54598":24116,"54599":24241,"54600":24244,"54601":24249,"54602":24242,"54603":24243,"54604":24374,"54605":24376,"54606":24475,"54607":24470,"54608":24479,"54609":24714,"54610":24720,"54611":24710,"54612":24766,"54613":24752,"54614":24762,"54615":24787,"54616":24788,"54617":24783,"54618":24804,"54619":24793,"54620":24797,"54621":24776,"54622":24753,"54623":24795,"54624":24759,"54625":24778,"54626":24767,"54627":24771,"54628":24781,"54629":24768,"54630":25394,"54631":25445,"54632":25482,"54633":25474,"54634":25469,"54635":25533,"54636":25502,"54637":25517,"54638":25501,"54639":25495,"54640":25515,"54641":25486,"54642":25455,"54643":25479,"54644":25488,"54645":25454,"54646":25519,"54647":25461,"54648":25500,"54649":25453,"54650":25518,"54651":25468,"54652":25508,"54653":25403,"54654":25503,"54689":25464,"54690":25477,"54691":25473,"54692":25489,"54693":25485,"54694":25456,"54695":25939,"54696":26061,"54697":26213,"54698":26209,"54699":26203,"54700":26201,"54701":26204,"54702":26210,"54703":26392,"54704":26745,"54705":26759,"54706":26768,"54707":26780,"54708":26733,"54709":26734,"54710":26798,"54711":26795,"54712":26966,"54713":26735,"54714":26787,"54715":26796,"54716":26793,"54717":26741,"54718":26740,"54719":26802,"54720":26767,"54721":26743,"54722":26770,"54723":26748,"54724":26731,"54725":26738,"54726":26794,"54727":26752,"54728":26737,"54729":26750,"54730":26779,"54731":26774,"54732":26763,"54733":26784,"54734":26761,"54735":26788,"54736":26744,"54737":26747,"54738":26769,"54739":26764,"54740":26762,"54741":26749,"54742":27446,"54743":27443,"54744":27447,"54745":27448,"54746":27537,"54747":27535,"54748":27533,"54749":27534,"54750":27532,"54751":27690,"54752":28096,"54753":28075,"54754":28084,"54755":28083,"54756":28276,"54757":28076,"54758":28137,"54759":28130,"54760":28087,"54761":28150,"54762":28116,"54763":28160,"54764":28104,"54765":28128,"54766":28127,"54767":28118,"54768":28094,"54769":28133,"54770":28124,"54771":28125,"54772":28123,"54773":28148,"54774":28106,"54775":28093,"54776":28141,"54777":28144,"54778":28090,"54779":28117,"54780":28098,"54781":28111,"54782":28105,"54848":28112,"54849":28146,"54850":28115,"54851":28157,"54852":28119,"54853":28109,"54854":28131,"54855":28091,"54856":28922,"54857":28941,"54858":28919,"54859":28951,"54860":28916,"54861":28940,"54862":28912,"54863":28932,"54864":28915,"54865":28944,"54866":28924,"54867":28927,"54868":28934,"54869":28947,"54870":28928,"54871":28920,"54872":28918,"54873":28939,"54874":28930,"54875":28942,"54876":29310,"54877":29307,"54878":29308,"54879":29311,"54880":29469,"54881":29463,"54882":29447,"54883":29457,"54884":29464,"54885":29450,"54886":29448,"54887":29439,"54888":29455,"54889":29470,"54890":29576,"54891":29686,"54892":29688,"54893":29685,"54894":29700,"54895":29697,"54896":29693,"54897":29703,"54898":29696,"54899":29690,"54900":29692,"54901":29695,"54902":29708,"54903":29707,"54904":29684,"54905":29704,"54906":30052,"54907":30051,"54908":30158,"54909":30162,"54910":30159,"54945":30155,"54946":30156,"54947":30161,"54948":30160,"54949":30351,"54950":30345,"54951":30419,"54952":30521,"54953":30511,"54954":30509,"54955":30513,"54956":30514,"54957":30516,"54958":30515,"54959":30525,"54960":30501,"54961":30523,"54962":30517,"54963":30792,"54964":30802,"54965":30793,"54966":30797,"54967":30794,"54968":30796,"54969":30758,"54970":30789,"54971":30800,"54972":31076,"54973":31079,"54974":31081,"54975":31082,"54976":31075,"54977":31083,"54978":31073,"54979":31163,"54980":31226,"54981":31224,"54982":31222,"54983":31223,"54984":31375,"54985":31380,"54986":31376,"54987":31541,"54988":31559,"54989":31540,"54990":31525,"54991":31536,"54992":31522,"54993":31524,"54994":31539,"54995":31512,"54996":31530,"54997":31517,"54998":31537,"54999":31531,"55000":31533,"55001":31535,"55002":31538,"55003":31544,"55004":31514,"55005":31523,"55006":31892,"55007":31896,"55008":31894,"55009":31907,"55010":32053,"55011":32061,"55012":32056,"55013":32054,"55014":32058,"55015":32069,"55016":32044,"55017":32041,"55018":32065,"55019":32071,"55020":32062,"55021":32063,"55022":32074,"55023":32059,"55024":32040,"55025":32611,"55026":32661,"55027":32668,"55028":32669,"55029":32667,"55030":32714,"55031":32715,"55032":32717,"55033":32720,"55034":32721,"55035":32711,"55036":32719,"55037":32713,"55038":32799,"55104":32798,"55105":32795,"55106":32839,"55107":32835,"55108":32840,"55109":33048,"55110":33061,"55111":33049,"55112":33051,"55113":33069,"55114":33055,"55115":33068,"55116":33054,"55117":33057,"55118":33045,"55119":33063,"55120":33053,"55121":33058,"55122":33297,"55123":33336,"55124":33331,"55125":33338,"55126":33332,"55127":33330,"55128":33396,"55129":33680,"55130":33699,"55131":33704,"55132":33677,"55133":33658,"55134":33651,"55135":33700,"55136":33652,"55137":33679,"55138":33665,"55139":33685,"55140":33689,"55141":33653,"55142":33684,"55143":33705,"55144":33661,"55145":33667,"55146":33676,"55147":33693,"55148":33691,"55149":33706,"55150":33675,"55151":33662,"55152":33701,"55153":33711,"55154":33672,"55155":33687,"55156":33712,"55157":33663,"55158":33702,"55159":33671,"55160":33710,"55161":33654,"55162":33690,"55163":34393,"55164":34390,"55165":34495,"55166":34487,"55201":34498,"55202":34497,"55203":34501,"55204":34490,"55205":34480,"55206":34504,"55207":34489,"55208":34483,"55209":34488,"55210":34508,"55211":34484,"55212":34491,"55213":34492,"55214":34499,"55215":34493,"55216":34494,"55217":34898,"55218":34953,"55219":34965,"55220":34984,"55221":34978,"55222":34986,"55223":34970,"55224":34961,"55225":34977,"55226":34975,"55227":34968,"55228":34983,"55229":34969,"55230":34971,"55231":34967,"55232":34980,"55233":34988,"55234":34956,"55235":34963,"55236":34958,"55237":35202,"55238":35286,"55239":35289,"55240":35285,"55241":35376,"55242":35367,"55243":35372,"55244":35358,"55245":35897,"55246":35899,"55247":35932,"55248":35933,"55249":35965,"55250":36005,"55251":36221,"55252":36219,"55253":36217,"55254":36284,"55255":36290,"55256":36281,"55257":36287,"55258":36289,"55259":36568,"55260":36574,"55261":36573,"55262":36572,"55263":36567,"55264":36576,"55265":36577,"55266":36900,"55267":36875,"55268":36881,"55269":36892,"55270":36876,"55271":36897,"55272":37103,"55273":37098,"55274":37104,"55275":37108,"55276":37106,"55277":37107,"55278":37076,"55279":37099,"55280":37100,"55281":37097,"55282":37206,"55283":37208,"55284":37210,"55285":37203,"55286":37205,"55287":37356,"55288":37364,"55289":37361,"55290":37363,"55291":37368,"55292":37348,"55293":37369,"55294":37354,"55360":37355,"55361":37367,"55362":37352,"55363":37358,"55364":38266,"55365":38278,"55366":38280,"55367":38524,"55368":38509,"55369":38507,"55370":38513,"55371":38511,"55372":38591,"55373":38762,"55374":38916,"55375":39141,"55376":39319,"55377":20635,"55378":20629,"55379":20628,"55380":20638,"55381":20619,"55382":20643,"55383":20611,"55384":20620,"55385":20622,"55386":20637,"55387":20584,"55388":20636,"55389":20626,"55390":20610,"55391":20615,"55392":20831,"55393":20948,"55394":21266,"55395":21265,"55396":21412,"55397":21415,"55398":21905,"55399":21928,"55400":21925,"55401":21933,"55402":21879,"55403":22085,"55404":21922,"55405":21907,"55406":21896,"55407":21903,"55408":21941,"55409":21889,"55410":21923,"55411":21906,"55412":21924,"55413":21885,"55414":21900,"55415":21926,"55416":21887,"55417":21909,"55418":21921,"55419":21902,"55420":22284,"55421":22569,"55422":22583,"55457":22553,"55458":22558,"55459":22567,"55460":22563,"55461":22568,"55462":22517,"55463":22600,"55464":22565,"55465":22556,"55466":22555,"55467":22579,"55468":22591,"55469":22582,"55470":22574,"55471":22585,"55472":22584,"55473":22573,"55474":22572,"55475":22587,"55476":22881,"55477":23215,"55478":23188,"55479":23199,"55480":23162,"55481":23202,"55482":23198,"55483":23160,"55484":23206,"55485":23164,"55486":23205,"55487":23212,"55488":23189,"55489":23214,"55490":23095,"55491":23172,"55492":23178,"55493":23191,"55494":23171,"55495":23179,"55496":23209,"55497":23163,"55498":23165,"55499":23180,"55500":23196,"55501":23183,"55502":23187,"55503":23197,"55504":23530,"55505":23501,"55506":23499,"55507":23508,"55508":23505,"55509":23498,"55510":23502,"55511":23564,"55512":23600,"55513":23863,"55514":23875,"55515":23915,"55516":23873,"55517":23883,"55518":23871,"55519":23861,"55520":23889,"55521":23886,"55522":23893,"55523":23859,"55524":23866,"55525":23890,"55526":23869,"55527":23857,"55528":23897,"55529":23874,"55530":23865,"55531":23881,"55532":23864,"55533":23868,"55534":23858,"55535":23862,"55536":23872,"55537":23877,"55538":24132,"55539":24129,"55540":24408,"55541":24486,"55542":24485,"55543":24491,"55544":24777,"55545":24761,"55546":24780,"55547":24802,"55548":24782,"55549":24772,"55550":24852,"55616":24818,"55617":24842,"55618":24854,"55619":24837,"55620":24821,"55621":24851,"55622":24824,"55623":24828,"55624":24830,"55625":24769,"55626":24835,"55627":24856,"55628":24861,"55629":24848,"55630":24831,"55631":24836,"55632":24843,"55633":25162,"55634":25492,"55635":25521,"55636":25520,"55637":25550,"55638":25573,"55639":25576,"55640":25583,"55641":25539,"55642":25757,"55643":25587,"55644":25546,"55645":25568,"55646":25590,"55647":25557,"55648":25586,"55649":25589,"55650":25697,"55651":25567,"55652":25534,"55653":25565,"55654":25564,"55655":25540,"55656":25560,"55657":25555,"55658":25538,"55659":25543,"55660":25548,"55661":25547,"55662":25544,"55663":25584,"55664":25559,"55665":25561,"55666":25906,"55667":25959,"55668":25962,"55669":25956,"55670":25948,"55671":25960,"55672":25957,"55673":25996,"55674":26013,"55675":26014,"55676":26030,"55677":26064,"55678":26066,"55713":26236,"55714":26220,"55715":26235,"55716":26240,"55717":26225,"55718":26233,"55719":26218,"55720":26226,"55721":26369,"55722":26892,"55723":26835,"55724":26884,"55725":26844,"55726":26922,"55727":26860,"55728":26858,"55729":26865,"55730":26895,"55731":26838,"55732":26871,"55733":26859,"55734":26852,"55735":26870,"55736":26899,"55737":26896,"55738":26867,"55739":26849,"55740":26887,"55741":26828,"55742":26888,"55743":26992,"55744":26804,"55745":26897,"55746":26863,"55747":26822,"55748":26900,"55749":26872,"55750":26832,"55751":26877,"55752":26876,"55753":26856,"55754":26891,"55755":26890,"55756":26903,"55757":26830,"55758":26824,"55759":26845,"55760":26846,"55761":26854,"55762":26868,"55763":26833,"55764":26886,"55765":26836,"55766":26857,"55767":26901,"55768":26917,"55769":26823,"55770":27449,"55771":27451,"55772":27455,"55773":27452,"55774":27540,"55775":27543,"55776":27545,"55777":27541,"55778":27581,"55779":27632,"55780":27634,"55781":27635,"55782":27696,"55783":28156,"55784":28230,"55785":28231,"55786":28191,"55787":28233,"55788":28296,"55789":28220,"55790":28221,"55791":28229,"55792":28258,"55793":28203,"55794":28223,"55795":28225,"55796":28253,"55797":28275,"55798":28188,"55799":28211,"55800":28235,"55801":28224,"55802":28241,"55803":28219,"55804":28163,"55805":28206,"55806":28254,"55872":28264,"55873":28252,"55874":28257,"55875":28209,"55876":28200,"55877":28256,"55878":28273,"55879":28267,"55880":28217,"55881":28194,"55882":28208,"55883":28243,"55884":28261,"55885":28199,"55886":28280,"55887":28260,"55888":28279,"55889":28245,"55890":28281,"55891":28242,"55892":28262,"55893":28213,"55894":28214,"55895":28250,"55896":28960,"55897":28958,"55898":28975,"55899":28923,"55900":28974,"55901":28977,"55902":28963,"55903":28965,"55904":28962,"55905":28978,"55906":28959,"55907":28968,"55908":28986,"55909":28955,"55910":29259,"55911":29274,"55912":29320,"55913":29321,"55914":29318,"55915":29317,"55916":29323,"55917":29458,"55918":29451,"55919":29488,"55920":29474,"55921":29489,"55922":29491,"55923":29479,"55924":29490,"55925":29485,"55926":29478,"55927":29475,"55928":29493,"55929":29452,"55930":29742,"55931":29740,"55932":29744,"55933":29739,"55934":29718,"55969":29722,"55970":29729,"55971":29741,"55972":29745,"55973":29732,"55974":29731,"55975":29725,"55976":29737,"55977":29728,"55978":29746,"55979":29947,"55980":29999,"55981":30063,"55982":30060,"55983":30183,"55984":30170,"55985":30177,"55986":30182,"55987":30173,"55988":30175,"55989":30180,"55990":30167,"55991":30357,"55992":30354,"55993":30426,"55994":30534,"55995":30535,"55996":30532,"55997":30541,"55998":30533,"55999":30538,"56000":30542,"56001":30539,"56002":30540,"56003":30686,"56004":30700,"56005":30816,"56006":30820,"56007":30821,"56008":30812,"56009":30829,"56010":30833,"56011":30826,"56012":30830,"56013":30832,"56014":30825,"56015":30824,"56016":30814,"56017":30818,"56018":31092,"56019":31091,"56020":31090,"56021":31088,"56022":31234,"56023":31242,"56024":31235,"56025":31244,"56026":31236,"56027":31385,"56028":31462,"56029":31460,"56030":31562,"56031":31547,"56032":31556,"56033":31560,"56034":31564,"56035":31566,"56036":31552,"56037":31576,"56038":31557,"56039":31906,"56040":31902,"56041":31912,"56042":31905,"56043":32088,"56044":32111,"56045":32099,"56046":32083,"56047":32086,"56048":32103,"56049":32106,"56050":32079,"56051":32109,"56052":32092,"56053":32107,"56054":32082,"56055":32084,"56056":32105,"56057":32081,"56058":32095,"56059":32078,"56060":32574,"56061":32575,"56062":32613,"56128":32614,"56129":32674,"56130":32672,"56131":32673,"56132":32727,"56133":32849,"56134":32847,"56135":32848,"56136":33022,"56137":32980,"56138":33091,"56139":33098,"56140":33106,"56141":33103,"56142":33095,"56143":33085,"56144":33101,"56145":33082,"56146":33254,"56147":33262,"56148":33271,"56149":33272,"56150":33273,"56151":33284,"56152":33340,"56153":33341,"56154":33343,"56155":33397,"56156":33595,"56157":33743,"56158":33785,"56159":33827,"56160":33728,"56161":33768,"56162":33810,"56163":33767,"56164":33764,"56165":33788,"56166":33782,"56167":33808,"56168":33734,"56169":33736,"56170":33771,"56171":33763,"56172":33727,"56173":33793,"56174":33757,"56175":33765,"56176":33752,"56177":33791,"56178":33761,"56179":33739,"56180":33742,"56181":33750,"56182":33781,"56183":33737,"56184":33801,"56185":33807,"56186":33758,"56187":33809,"56188":33798,"56189":33730,"56190":33779,"56225":33749,"56226":33786,"56227":33735,"56228":33745,"56229":33770,"56230":33811,"56231":33731,"56232":33772,"56233":33774,"56234":33732,"56235":33787,"56236":33751,"56237":33762,"56238":33819,"56239":33755,"56240":33790,"56241":34520,"56242":34530,"56243":34534,"56244":34515,"56245":34531,"56246":34522,"56247":34538,"56248":34525,"56249":34539,"56250":34524,"56251":34540,"56252":34537,"56253":34519,"56254":34536,"56255":34513,"56256":34888,"56257":34902,"56258":34901,"56259":35002,"56260":35031,"56261":35001,"56262":35000,"56263":35008,"56264":35006,"56265":34998,"56266":35004,"56267":34999,"56268":35005,"56269":34994,"56270":35073,"56271":35017,"56272":35221,"56273":35224,"56274":35223,"56275":35293,"56276":35290,"56277":35291,"56278":35406,"56279":35405,"56280":35385,"56281":35417,"56282":35392,"56283":35415,"56284":35416,"56285":35396,"56286":35397,"56287":35410,"56288":35400,"56289":35409,"56290":35402,"56291":35404,"56292":35407,"56293":35935,"56294":35969,"56295":35968,"56296":36026,"56297":36030,"56298":36016,"56299":36025,"56300":36021,"56301":36228,"56302":36224,"56303":36233,"56304":36312,"56305":36307,"56306":36301,"56307":36295,"56308":36310,"56309":36316,"56310":36303,"56311":36309,"56312":36313,"56313":36296,"56314":36311,"56315":36293,"56316":36591,"56317":36599,"56318":36602,"56384":36601,"56385":36582,"56386":36590,"56387":36581,"56388":36597,"56389":36583,"56390":36584,"56391":36598,"56392":36587,"56393":36593,"56394":36588,"56395":36596,"56396":36585,"56397":36909,"56398":36916,"56399":36911,"56400":37126,"56401":37164,"56402":37124,"56403":37119,"56404":37116,"56405":37128,"56406":37113,"56407":37115,"56408":37121,"56409":37120,"56410":37127,"56411":37125,"56412":37123,"56413":37217,"56414":37220,"56415":37215,"56416":37218,"56417":37216,"56418":37377,"56419":37386,"56420":37413,"56421":37379,"56422":37402,"56423":37414,"56424":37391,"56425":37388,"56426":37376,"56427":37394,"56428":37375,"56429":37373,"56430":37382,"56431":37380,"56432":37415,"56433":37378,"56434":37404,"56435":37412,"56436":37401,"56437":37399,"56438":37381,"56439":37398,"56440":38267,"56441":38285,"56442":38284,"56443":38288,"56444":38535,"56445":38526,"56446":38536,"56481":38537,"56482":38531,"56483":38528,"56484":38594,"56485":38600,"56486":38595,"56487":38641,"56488":38640,"56489":38764,"56490":38768,"56491":38766,"56492":38919,"56493":39081,"56494":39147,"56495":40166,"56496":40697,"56497":20099,"56498":20100,"56499":20150,"56500":20669,"56501":20671,"56502":20678,"56503":20654,"56504":20676,"56505":20682,"56506":20660,"56507":20680,"56508":20674,"56509":20656,"56510":20673,"56511":20666,"56512":20657,"56513":20683,"56514":20681,"56515":20662,"56516":20664,"56517":20951,"56518":21114,"56519":21112,"56520":21115,"56521":21116,"56522":21955,"56523":21979,"56524":21964,"56525":21968,"56526":21963,"56527":21962,"56528":21981,"56529":21952,"56530":21972,"56531":21956,"56532":21993,"56533":21951,"56534":21970,"56535":21901,"56536":21967,"56537":21973,"56538":21986,"56539":21974,"56540":21960,"56541":22002,"56542":21965,"56543":21977,"56544":21954,"56545":22292,"56546":22611,"56547":22632,"56548":22628,"56549":22607,"56550":22605,"56551":22601,"56552":22639,"56553":22613,"56554":22606,"56555":22621,"56556":22617,"56557":22629,"56558":22619,"56559":22589,"56560":22627,"56561":22641,"56562":22780,"56563":23239,"56564":23236,"56565":23243,"56566":23226,"56567":23224,"56568":23217,"56569":23221,"56570":23216,"56571":23231,"56572":23240,"56573":23227,"56574":23238,"56640":23223,"56641":23232,"56642":23242,"56643":23220,"56644":23222,"56645":23245,"56646":23225,"56647":23184,"56648":23510,"56649":23512,"56650":23513,"56651":23583,"56652":23603,"56653":23921,"56654":23907,"56655":23882,"56656":23909,"56657":23922,"56658":23916,"56659":23902,"56660":23912,"56661":23911,"56662":23906,"56663":24048,"56664":24143,"56665":24142,"56666":24138,"56667":24141,"56668":24139,"56669":24261,"56670":24268,"56671":24262,"56672":24267,"56673":24263,"56674":24384,"56675":24495,"56676":24493,"56677":24823,"56678":24905,"56679":24906,"56680":24875,"56681":24901,"56682":24886,"56683":24882,"56684":24878,"56685":24902,"56686":24879,"56687":24911,"56688":24873,"56689":24896,"56690":25120,"56691":37224,"56692":25123,"56693":25125,"56694":25124,"56695":25541,"56696":25585,"56697":25579,"56698":25616,"56699":25618,"56700":25609,"56701":25632,"56702":25636,"56737":25651,"56738":25667,"56739":25631,"56740":25621,"56741":25624,"56742":25657,"56743":25655,"56744":25634,"56745":25635,"56746":25612,"56747":25638,"56748":25648,"56749":25640,"56750":25665,"56751":25653,"56752":25647,"56753":25610,"56754":25626,"56755":25664,"56756":25637,"56757":25639,"56758":25611,"56759":25575,"56760":25627,"56761":25646,"56762":25633,"56763":25614,"56764":25967,"56765":26002,"56766":26067,"56767":26246,"56768":26252,"56769":26261,"56770":26256,"56771":26251,"56772":26250,"56773":26265,"56774":26260,"56775":26232,"56776":26400,"56777":26982,"56778":26975,"56779":26936,"56780":26958,"56781":26978,"56782":26993,"56783":26943,"56784":26949,"56785":26986,"56786":26937,"56787":26946,"56788":26967,"56789":26969,"56790":27002,"56791":26952,"56792":26953,"56793":26933,"56794":26988,"56795":26931,"56796":26941,"56797":26981,"56798":26864,"56799":27000,"56800":26932,"56801":26985,"56802":26944,"56803":26991,"56804":26948,"56805":26998,"56806":26968,"56807":26945,"56808":26996,"56809":26956,"56810":26939,"56811":26955,"56812":26935,"56813":26972,"56814":26959,"56815":26961,"56816":26930,"56817":26962,"56818":26927,"56819":27003,"56820":26940,"56821":27462,"56822":27461,"56823":27459,"56824":27458,"56825":27464,"56826":27457,"56827":27547,"56828":64013,"56829":27643,"56830":27644,"56896":27641,"56897":27639,"56898":27640,"56899":28315,"56900":28374,"56901":28360,"56902":28303,"56903":28352,"56904":28319,"56905":28307,"56906":28308,"56907":28320,"56908":28337,"56909":28345,"56910":28358,"56911":28370,"56912":28349,"56913":28353,"56914":28318,"56915":28361,"56916":28343,"56917":28336,"56918":28365,"56919":28326,"56920":28367,"56921":28338,"56922":28350,"56923":28355,"56924":28380,"56925":28376,"56926":28313,"56927":28306,"56928":28302,"56929":28301,"56930":28324,"56931":28321,"56932":28351,"56933":28339,"56934":28368,"56935":28362,"56936":28311,"56937":28334,"56938":28323,"56939":28999,"56940":29012,"56941":29010,"56942":29027,"56943":29024,"56944":28993,"56945":29021,"56946":29026,"56947":29042,"56948":29048,"56949":29034,"56950":29025,"56951":28994,"56952":29016,"56953":28995,"56954":29003,"56955":29040,"56956":29023,"56957":29008,"56958":29011,"56993":28996,"56994":29005,"56995":29018,"56996":29263,"56997":29325,"56998":29324,"56999":29329,"57000":29328,"57001":29326,"57002":29500,"57003":29506,"57004":29499,"57005":29498,"57006":29504,"57007":29514,"57008":29513,"57009":29764,"57010":29770,"57011":29771,"57012":29778,"57013":29777,"57014":29783,"57015":29760,"57016":29775,"57017":29776,"57018":29774,"57019":29762,"57020":29766,"57021":29773,"57022":29780,"57023":29921,"57024":29951,"57025":29950,"57026":29949,"57027":29981,"57028":30073,"57029":30071,"57030":27011,"57031":30191,"57032":30223,"57033":30211,"57034":30199,"57035":30206,"57036":30204,"57037":30201,"57038":30200,"57039":30224,"57040":30203,"57041":30198,"57042":30189,"57043":30197,"57044":30205,"57045":30361,"57046":30389,"57047":30429,"57048":30549,"57049":30559,"57050":30560,"57051":30546,"57052":30550,"57053":30554,"57054":30569,"57055":30567,"57056":30548,"57057":30553,"57058":30573,"57059":30688,"57060":30855,"57061":30874,"57062":30868,"57063":30863,"57064":30852,"57065":30869,"57066":30853,"57067":30854,"57068":30881,"57069":30851,"57070":30841,"57071":30873,"57072":30848,"57073":30870,"57074":30843,"57075":31100,"57076":31106,"57077":31101,"57078":31097,"57079":31249,"57080":31256,"57081":31257,"57082":31250,"57083":31255,"57084":31253,"57085":31266,"57086":31251,"57152":31259,"57153":31248,"57154":31395,"57155":31394,"57156":31390,"57157":31467,"57158":31590,"57159":31588,"57160":31597,"57161":31604,"57162":31593,"57163":31602,"57164":31589,"57165":31603,"57166":31601,"57167":31600,"57168":31585,"57169":31608,"57170":31606,"57171":31587,"57172":31922,"57173":31924,"57174":31919,"57175":32136,"57176":32134,"57177":32128,"57178":32141,"57179":32127,"57180":32133,"57181":32122,"57182":32142,"57183":32123,"57184":32131,"57185":32124,"57186":32140,"57187":32148,"57188":32132,"57189":32125,"57190":32146,"57191":32621,"57192":32619,"57193":32615,"57194":32616,"57195":32620,"57196":32678,"57197":32677,"57198":32679,"57199":32731,"57200":32732,"57201":32801,"57202":33124,"57203":33120,"57204":33143,"57205":33116,"57206":33129,"57207":33115,"57208":33122,"57209":33138,"57210":26401,"57211":33118,"57212":33142,"57213":33127,"57214":33135,"57249":33092,"57250":33121,"57251":33309,"57252":33353,"57253":33348,"57254":33344,"57255":33346,"57256":33349,"57257":34033,"57258":33855,"57259":33878,"57260":33910,"57261":33913,"57262":33935,"57263":33933,"57264":33893,"57265":33873,"57266":33856,"57267":33926,"57268":33895,"57269":33840,"57270":33869,"57271":33917,"57272":33882,"57273":33881,"57274":33908,"57275":33907,"57276":33885,"57277":34055,"57278":33886,"57279":33847,"57280":33850,"57281":33844,"57282":33914,"57283":33859,"57284":33912,"57285":33842,"57286":33861,"57287":33833,"57288":33753,"57289":33867,"57290":33839,"57291":33858,"57292":33837,"57293":33887,"57294":33904,"57295":33849,"57296":33870,"57297":33868,"57298":33874,"57299":33903,"57300":33989,"57301":33934,"57302":33851,"57303":33863,"57304":33846,"57305":33843,"57306":33896,"57307":33918,"57308":33860,"57309":33835,"57310":33888,"57311":33876,"57312":33902,"57313":33872,"57314":34571,"57315":34564,"57316":34551,"57317":34572,"57318":34554,"57319":34518,"57320":34549,"57321":34637,"57322":34552,"57323":34574,"57324":34569,"57325":34561,"57326":34550,"57327":34573,"57328":34565,"57329":35030,"57330":35019,"57331":35021,"57332":35022,"57333":35038,"57334":35035,"57335":35034,"57336":35020,"57337":35024,"57338":35205,"57339":35227,"57340":35295,"57341":35301,"57342":35300,"57408":35297,"57409":35296,"57410":35298,"57411":35292,"57412":35302,"57413":35446,"57414":35462,"57415":35455,"57416":35425,"57417":35391,"57418":35447,"57419":35458,"57420":35460,"57421":35445,"57422":35459,"57423":35457,"57424":35444,"57425":35450,"57426":35900,"57427":35915,"57428":35914,"57429":35941,"57430":35940,"57431":35942,"57432":35974,"57433":35972,"57434":35973,"57435":36044,"57436":36200,"57437":36201,"57438":36241,"57439":36236,"57440":36238,"57441":36239,"57442":36237,"57443":36243,"57444":36244,"57445":36240,"57446":36242,"57447":36336,"57448":36320,"57449":36332,"57450":36337,"57451":36334,"57452":36304,"57453":36329,"57454":36323,"57455":36322,"57456":36327,"57457":36338,"57458":36331,"57459":36340,"57460":36614,"57461":36607,"57462":36609,"57463":36608,"57464":36613,"57465":36615,"57466":36616,"57467":36610,"57468":36619,"57469":36946,"57470":36927,"57505":36932,"57506":36937,"57507":36925,"57508":37136,"57509":37133,"57510":37135,"57511":37137,"57512":37142,"57513":37140,"57514":37131,"57515":37134,"57516":37230,"57517":37231,"57518":37448,"57519":37458,"57520":37424,"57521":37434,"57522":37478,"57523":37427,"57524":37477,"57525":37470,"57526":37507,"57527":37422,"57528":37450,"57529":37446,"57530":37485,"57531":37484,"57532":37455,"57533":37472,"57534":37479,"57535":37487,"57536":37430,"57537":37473,"57538":37488,"57539":37425,"57540":37460,"57541":37475,"57542":37456,"57543":37490,"57544":37454,"57545":37459,"57546":37452,"57547":37462,"57548":37426,"57549":38303,"57550":38300,"57551":38302,"57552":38299,"57553":38546,"57554":38547,"57555":38545,"57556":38551,"57557":38606,"57558":38650,"57559":38653,"57560":38648,"57561":38645,"57562":38771,"57563":38775,"57564":38776,"57565":38770,"57566":38927,"57567":38925,"57568":38926,"57569":39084,"57570":39158,"57571":39161,"57572":39343,"57573":39346,"57574":39344,"57575":39349,"57576":39597,"57577":39595,"57578":39771,"57579":40170,"57580":40173,"57581":40167,"57582":40576,"57583":40701,"57584":20710,"57585":20692,"57586":20695,"57587":20712,"57588":20723,"57589":20699,"57590":20714,"57591":20701,"57592":20708,"57593":20691,"57594":20716,"57595":20720,"57596":20719,"57597":20707,"57598":20704,"57664":20952,"57665":21120,"57666":21121,"57667":21225,"57668":21227,"57669":21296,"57670":21420,"57671":22055,"57672":22037,"57673":22028,"57674":22034,"57675":22012,"57676":22031,"57677":22044,"57678":22017,"57679":22035,"57680":22018,"57681":22010,"57682":22045,"57683":22020,"57684":22015,"57685":22009,"57686":22665,"57687":22652,"57688":22672,"57689":22680,"57690":22662,"57691":22657,"57692":22655,"57693":22644,"57694":22667,"57695":22650,"57696":22663,"57697":22673,"57698":22670,"57699":22646,"57700":22658,"57701":22664,"57702":22651,"57703":22676,"57704":22671,"57705":22782,"57706":22891,"57707":23260,"57708":23278,"57709":23269,"57710":23253,"57711":23274,"57712":23258,"57713":23277,"57714":23275,"57715":23283,"57716":23266,"57717":23264,"57718":23259,"57719":23276,"57720":23262,"57721":23261,"57722":23257,"57723":23272,"57724":23263,"57725":23415,"57726":23520,"57761":23523,"57762":23651,"57763":23938,"57764":23936,"57765":23933,"57766":23942,"57767":23930,"57768":23937,"57769":23927,"57770":23946,"57771":23945,"57772":23944,"57773":23934,"57774":23932,"57775":23949,"57776":23929,"57777":23935,"57778":24152,"57779":24153,"57780":24147,"57781":24280,"57782":24273,"57783":24279,"57784":24270,"57785":24284,"57786":24277,"57787":24281,"57788":24274,"57789":24276,"57790":24388,"57791":24387,"57792":24431,"57793":24502,"57794":24876,"57795":24872,"57796":24897,"57797":24926,"57798":24945,"57799":24947,"57800":24914,"57801":24915,"57802":24946,"57803":24940,"57804":24960,"57805":24948,"57806":24916,"57807":24954,"57808":24923,"57809":24933,"57810":24891,"57811":24938,"57812":24929,"57813":24918,"57814":25129,"57815":25127,"57816":25131,"57817":25643,"57818":25677,"57819":25691,"57820":25693,"57821":25716,"57822":25718,"57823":25714,"57824":25715,"57825":25725,"57826":25717,"57827":25702,"57828":25766,"57829":25678,"57830":25730,"57831":25694,"57832":25692,"57833":25675,"57834":25683,"57835":25696,"57836":25680,"57837":25727,"57838":25663,"57839":25708,"57840":25707,"57841":25689,"57842":25701,"57843":25719,"57844":25971,"57845":26016,"57846":26273,"57847":26272,"57848":26271,"57849":26373,"57850":26372,"57851":26402,"57852":27057,"57853":27062,"57854":27081,"57920":27040,"57921":27086,"57922":27030,"57923":27056,"57924":27052,"57925":27068,"57926":27025,"57927":27033,"57928":27022,"57929":27047,"57930":27021,"57931":27049,"57932":27070,"57933":27055,"57934":27071,"57935":27076,"57936":27069,"57937":27044,"57938":27092,"57939":27065,"57940":27082,"57941":27034,"57942":27087,"57943":27059,"57944":27027,"57945":27050,"57946":27041,"57947":27038,"57948":27097,"57949":27031,"57950":27024,"57951":27074,"57952":27061,"57953":27045,"57954":27078,"57955":27466,"57956":27469,"57957":27467,"57958":27550,"57959":27551,"57960":27552,"57961":27587,"57962":27588,"57963":27646,"57964":28366,"57965":28405,"57966":28401,"57967":28419,"57968":28453,"57969":28408,"57970":28471,"57971":28411,"57972":28462,"57973":28425,"57974":28494,"57975":28441,"57976":28442,"57977":28455,"57978":28440,"57979":28475,"57980":28434,"57981":28397,"57982":28426,"58017":28470,"58018":28531,"58019":28409,"58020":28398,"58021":28461,"58022":28480,"58023":28464,"58024":28476,"58025":28469,"58026":28395,"58027":28423,"58028":28430,"58029":28483,"58030":28421,"58031":28413,"58032":28406,"58033":28473,"58034":28444,"58035":28412,"58036":28474,"58037":28447,"58038":28429,"58039":28446,"58040":28424,"58041":28449,"58042":29063,"58043":29072,"58044":29065,"58045":29056,"58046":29061,"58047":29058,"58048":29071,"58049":29051,"58050":29062,"58051":29057,"58052":29079,"58053":29252,"58054":29267,"58055":29335,"58056":29333,"58057":29331,"58058":29507,"58059":29517,"58060":29521,"58061":29516,"58062":29794,"58063":29811,"58064":29809,"58065":29813,"58066":29810,"58067":29799,"58068":29806,"58069":29952,"58070":29954,"58071":29955,"58072":30077,"58073":30096,"58074":30230,"58075":30216,"58076":30220,"58077":30229,"58078":30225,"58079":30218,"58080":30228,"58081":30392,"58082":30593,"58083":30588,"58084":30597,"58085":30594,"58086":30574,"58087":30592,"58088":30575,"58089":30590,"58090":30595,"58091":30898,"58092":30890,"58093":30900,"58094":30893,"58095":30888,"58096":30846,"58097":30891,"58098":30878,"58099":30885,"58100":30880,"58101":30892,"58102":30882,"58103":30884,"58104":31128,"58105":31114,"58106":31115,"58107":31126,"58108":31125,"58109":31124,"58110":31123,"58176":31127,"58177":31112,"58178":31122,"58179":31120,"58180":31275,"58181":31306,"58182":31280,"58183":31279,"58184":31272,"58185":31270,"58186":31400,"58187":31403,"58188":31404,"58189":31470,"58190":31624,"58191":31644,"58192":31626,"58193":31633,"58194":31632,"58195":31638,"58196":31629,"58197":31628,"58198":31643,"58199":31630,"58200":31621,"58201":31640,"58202":21124,"58203":31641,"58204":31652,"58205":31618,"58206":31931,"58207":31935,"58208":31932,"58209":31930,"58210":32167,"58211":32183,"58212":32194,"58213":32163,"58214":32170,"58215":32193,"58216":32192,"58217":32197,"58218":32157,"58219":32206,"58220":32196,"58221":32198,"58222":32203,"58223":32204,"58224":32175,"58225":32185,"58226":32150,"58227":32188,"58228":32159,"58229":32166,"58230":32174,"58231":32169,"58232":32161,"58233":32201,"58234":32627,"58235":32738,"58236":32739,"58237":32741,"58238":32734,"58273":32804,"58274":32861,"58275":32860,"58276":33161,"58277":33158,"58278":33155,"58279":33159,"58280":33165,"58281":33164,"58282":33163,"58283":33301,"58284":33943,"58285":33956,"58286":33953,"58287":33951,"58288":33978,"58289":33998,"58290":33986,"58291":33964,"58292":33966,"58293":33963,"58294":33977,"58295":33972,"58296":33985,"58297":33997,"58298":33962,"58299":33946,"58300":33969,"58301":34000,"58302":33949,"58303":33959,"58304":33979,"58305":33954,"58306":33940,"58307":33991,"58308":33996,"58309":33947,"58310":33961,"58311":33967,"58312":33960,"58313":34006,"58314":33944,"58315":33974,"58316":33999,"58317":33952,"58318":34007,"58319":34004,"58320":34002,"58321":34011,"58322":33968,"58323":33937,"58324":34401,"58325":34611,"58326":34595,"58327":34600,"58328":34667,"58329":34624,"58330":34606,"58331":34590,"58332":34593,"58333":34585,"58334":34587,"58335":34627,"58336":34604,"58337":34625,"58338":34622,"58339":34630,"58340":34592,"58341":34610,"58342":34602,"58343":34605,"58344":34620,"58345":34578,"58346":34618,"58347":34609,"58348":34613,"58349":34626,"58350":34598,"58351":34599,"58352":34616,"58353":34596,"58354":34586,"58355":34608,"58356":34577,"58357":35063,"58358":35047,"58359":35057,"58360":35058,"58361":35066,"58362":35070,"58363":35054,"58364":35068,"58365":35062,"58366":35067,"58432":35056,"58433":35052,"58434":35051,"58435":35229,"58436":35233,"58437":35231,"58438":35230,"58439":35305,"58440":35307,"58441":35304,"58442":35499,"58443":35481,"58444":35467,"58445":35474,"58446":35471,"58447":35478,"58448":35901,"58449":35944,"58450":35945,"58451":36053,"58452":36047,"58453":36055,"58454":36246,"58455":36361,"58456":36354,"58457":36351,"58458":36365,"58459":36349,"58460":36362,"58461":36355,"58462":36359,"58463":36358,"58464":36357,"58465":36350,"58466":36352,"58467":36356,"58468":36624,"58469":36625,"58470":36622,"58471":36621,"58472":37155,"58473":37148,"58474":37152,"58475":37154,"58476":37151,"58477":37149,"58478":37146,"58479":37156,"58480":37153,"58481":37147,"58482":37242,"58483":37234,"58484":37241,"58485":37235,"58486":37541,"58487":37540,"58488":37494,"58489":37531,"58490":37498,"58491":37536,"58492":37524,"58493":37546,"58494":37517,"58529":37542,"58530":37530,"58531":37547,"58532":37497,"58533":37527,"58534":37503,"58535":37539,"58536":37614,"58537":37518,"58538":37506,"58539":37525,"58540":37538,"58541":37501,"58542":37512,"58543":37537,"58544":37514,"58545":37510,"58546":37516,"58547":37529,"58548":37543,"58549":37502,"58550":37511,"58551":37545,"58552":37533,"58553":37515,"58554":37421,"58555":38558,"58556":38561,"58557":38655,"58558":38744,"58559":38781,"58560":38778,"58561":38782,"58562":38787,"58563":38784,"58564":38786,"58565":38779,"58566":38788,"58567":38785,"58568":38783,"58569":38862,"58570":38861,"58571":38934,"58572":39085,"58573":39086,"58574":39170,"58575":39168,"58576":39175,"58577":39325,"58578":39324,"58579":39363,"58580":39353,"58581":39355,"58582":39354,"58583":39362,"58584":39357,"58585":39367,"58586":39601,"58587":39651,"58588":39655,"58589":39742,"58590":39743,"58591":39776,"58592":39777,"58593":39775,"58594":40177,"58595":40178,"58596":40181,"58597":40615,"58598":20735,"58599":20739,"58600":20784,"58601":20728,"58602":20742,"58603":20743,"58604":20726,"58605":20734,"58606":20747,"58607":20748,"58608":20733,"58609":20746,"58610":21131,"58611":21132,"58612":21233,"58613":21231,"58614":22088,"58615":22082,"58616":22092,"58617":22069,"58618":22081,"58619":22090,"58620":22089,"58621":22086,"58622":22104,"58688":22106,"58689":22080,"58690":22067,"58691":22077,"58692":22060,"58693":22078,"58694":22072,"58695":22058,"58696":22074,"58697":22298,"58698":22699,"58699":22685,"58700":22705,"58701":22688,"58702":22691,"58703":22703,"58704":22700,"58705":22693,"58706":22689,"58707":22783,"58708":23295,"58709":23284,"58710":23293,"58711":23287,"58712":23286,"58713":23299,"58714":23288,"58715":23298,"58716":23289,"58717":23297,"58718":23303,"58719":23301,"58720":23311,"58721":23655,"58722":23961,"58723":23959,"58724":23967,"58725":23954,"58726":23970,"58727":23955,"58728":23957,"58729":23968,"58730":23964,"58731":23969,"58732":23962,"58733":23966,"58734":24169,"58735":24157,"58736":24160,"58737":24156,"58738":32243,"58739":24283,"58740":24286,"58741":24289,"58742":24393,"58743":24498,"58744":24971,"58745":24963,"58746":24953,"58747":25009,"58748":25008,"58749":24994,"58750":24969,"58785":24987,"58786":24979,"58787":25007,"58788":25005,"58789":24991,"58790":24978,"58791":25002,"58792":24993,"58793":24973,"58794":24934,"58795":25011,"58796":25133,"58797":25710,"58798":25712,"58799":25750,"58800":25760,"58801":25733,"58802":25751,"58803":25756,"58804":25743,"58805":25739,"58806":25738,"58807":25740,"58808":25763,"58809":25759,"58810":25704,"58811":25777,"58812":25752,"58813":25974,"58814":25978,"58815":25977,"58816":25979,"58817":26034,"58818":26035,"58819":26293,"58820":26288,"58821":26281,"58822":26290,"58823":26295,"58824":26282,"58825":26287,"58826":27136,"58827":27142,"58828":27159,"58829":27109,"58830":27128,"58831":27157,"58832":27121,"58833":27108,"58834":27168,"58835":27135,"58836":27116,"58837":27106,"58838":27163,"58839":27165,"58840":27134,"58841":27175,"58842":27122,"58843":27118,"58844":27156,"58845":27127,"58846":27111,"58847":27200,"58848":27144,"58849":27110,"58850":27131,"58851":27149,"58852":27132,"58853":27115,"58854":27145,"58855":27140,"58856":27160,"58857":27173,"58858":27151,"58859":27126,"58860":27174,"58861":27143,"58862":27124,"58863":27158,"58864":27473,"58865":27557,"58866":27555,"58867":27554,"58868":27558,"58869":27649,"58870":27648,"58871":27647,"58872":27650,"58873":28481,"58874":28454,"58875":28542,"58876":28551,"58877":28614,"58878":28562,"58944":28557,"58945":28553,"58946":28556,"58947":28514,"58948":28495,"58949":28549,"58950":28506,"58951":28566,"58952":28534,"58953":28524,"58954":28546,"58955":28501,"58956":28530,"58957":28498,"58958":28496,"58959":28503,"58960":28564,"58961":28563,"58962":28509,"58963":28416,"58964":28513,"58965":28523,"58966":28541,"58967":28519,"58968":28560,"58969":28499,"58970":28555,"58971":28521,"58972":28543,"58973":28565,"58974":28515,"58975":28535,"58976":28522,"58977":28539,"58978":29106,"58979":29103,"58980":29083,"58981":29104,"58982":29088,"58983":29082,"58984":29097,"58985":29109,"58986":29085,"58987":29093,"58988":29086,"58989":29092,"58990":29089,"58991":29098,"58992":29084,"58993":29095,"58994":29107,"58995":29336,"58996":29338,"58997":29528,"58998":29522,"58999":29534,"59000":29535,"59001":29536,"59002":29533,"59003":29531,"59004":29537,"59005":29530,"59006":29529,"59041":29538,"59042":29831,"59043":29833,"59044":29834,"59045":29830,"59046":29825,"59047":29821,"59048":29829,"59049":29832,"59050":29820,"59051":29817,"59052":29960,"59053":29959,"59054":30078,"59055":30245,"59056":30238,"59057":30233,"59058":30237,"59059":30236,"59060":30243,"59061":30234,"59062":30248,"59063":30235,"59064":30364,"59065":30365,"59066":30366,"59067":30363,"59068":30605,"59069":30607,"59070":30601,"59071":30600,"59072":30925,"59073":30907,"59074":30927,"59075":30924,"59076":30929,"59077":30926,"59078":30932,"59079":30920,"59080":30915,"59081":30916,"59082":30921,"59083":31130,"59084":31137,"59085":31136,"59086":31132,"59087":31138,"59088":31131,"59089":27510,"59090":31289,"59091":31410,"59092":31412,"59093":31411,"59094":31671,"59095":31691,"59096":31678,"59097":31660,"59098":31694,"59099":31663,"59100":31673,"59101":31690,"59102":31669,"59103":31941,"59104":31944,"59105":31948,"59106":31947,"59107":32247,"59108":32219,"59109":32234,"59110":32231,"59111":32215,"59112":32225,"59113":32259,"59114":32250,"59115":32230,"59116":32246,"59117":32241,"59118":32240,"59119":32238,"59120":32223,"59121":32630,"59122":32684,"59123":32688,"59124":32685,"59125":32749,"59126":32747,"59127":32746,"59128":32748,"59129":32742,"59130":32744,"59131":32868,"59132":32871,"59133":33187,"59134":33183,"59200":33182,"59201":33173,"59202":33186,"59203":33177,"59204":33175,"59205":33302,"59206":33359,"59207":33363,"59208":33362,"59209":33360,"59210":33358,"59211":33361,"59212":34084,"59213":34107,"59214":34063,"59215":34048,"59216":34089,"59217":34062,"59218":34057,"59219":34061,"59220":34079,"59221":34058,"59222":34087,"59223":34076,"59224":34043,"59225":34091,"59226":34042,"59227":34056,"59228":34060,"59229":34036,"59230":34090,"59231":34034,"59232":34069,"59233":34039,"59234":34027,"59235":34035,"59236":34044,"59237":34066,"59238":34026,"59239":34025,"59240":34070,"59241":34046,"59242":34088,"59243":34077,"59244":34094,"59245":34050,"59246":34045,"59247":34078,"59248":34038,"59249":34097,"59250":34086,"59251":34023,"59252":34024,"59253":34032,"59254":34031,"59255":34041,"59256":34072,"59257":34080,"59258":34096,"59259":34059,"59260":34073,"59261":34095,"59262":34402,"59297":34646,"59298":34659,"59299":34660,"59300":34679,"59301":34785,"59302":34675,"59303":34648,"59304":34644,"59305":34651,"59306":34642,"59307":34657,"59308":34650,"59309":34641,"59310":34654,"59311":34669,"59312":34666,"59313":34640,"59314":34638,"59315":34655,"59316":34653,"59317":34671,"59318":34668,"59319":34682,"59320":34670,"59321":34652,"59322":34661,"59323":34639,"59324":34683,"59325":34677,"59326":34658,"59327":34663,"59328":34665,"59329":34906,"59330":35077,"59331":35084,"59332":35092,"59333":35083,"59334":35095,"59335":35096,"59336":35097,"59337":35078,"59338":35094,"59339":35089,"59340":35086,"59341":35081,"59342":35234,"59343":35236,"59344":35235,"59345":35309,"59346":35312,"59347":35308,"59348":35535,"59349":35526,"59350":35512,"59351":35539,"59352":35537,"59353":35540,"59354":35541,"59355":35515,"59356":35543,"59357":35518,"59358":35520,"59359":35525,"59360":35544,"59361":35523,"59362":35514,"59363":35517,"59364":35545,"59365":35902,"59366":35917,"59367":35983,"59368":36069,"59369":36063,"59370":36057,"59371":36072,"59372":36058,"59373":36061,"59374":36071,"59375":36256,"59376":36252,"59377":36257,"59378":36251,"59379":36384,"59380":36387,"59381":36389,"59382":36388,"59383":36398,"59384":36373,"59385":36379,"59386":36374,"59387":36369,"59388":36377,"59389":36390,"59390":36391,"59456":36372,"59457":36370,"59458":36376,"59459":36371,"59460":36380,"59461":36375,"59462":36378,"59463":36652,"59464":36644,"59465":36632,"59466":36634,"59467":36640,"59468":36643,"59469":36630,"59470":36631,"59471":36979,"59472":36976,"59473":36975,"59474":36967,"59475":36971,"59476":37167,"59477":37163,"59478":37161,"59479":37162,"59480":37170,"59481":37158,"59482":37166,"59483":37253,"59484":37254,"59485":37258,"59486":37249,"59487":37250,"59488":37252,"59489":37248,"59490":37584,"59491":37571,"59492":37572,"59493":37568,"59494":37593,"59495":37558,"59496":37583,"59497":37617,"59498":37599,"59499":37592,"59500":37609,"59501":37591,"59502":37597,"59503":37580,"59504":37615,"59505":37570,"59506":37608,"59507":37578,"59508":37576,"59509":37582,"59510":37606,"59511":37581,"59512":37589,"59513":37577,"59514":37600,"59515":37598,"59516":37607,"59517":37585,"59518":37587,"59553":37557,"59554":37601,"59555":37574,"59556":37556,"59557":38268,"59558":38316,"59559":38315,"59560":38318,"59561":38320,"59562":38564,"59563":38562,"59564":38611,"59565":38661,"59566":38664,"59567":38658,"59568":38746,"59569":38794,"59570":38798,"59571":38792,"59572":38864,"59573":38863,"59574":38942,"59575":38941,"59576":38950,"59577":38953,"59578":38952,"59579":38944,"59580":38939,"59581":38951,"59582":39090,"59583":39176,"59584":39162,"59585":39185,"59586":39188,"59587":39190,"59588":39191,"59589":39189,"59590":39388,"59591":39373,"59592":39375,"59593":39379,"59594":39380,"59595":39374,"59596":39369,"59597":39382,"59598":39384,"59599":39371,"59600":39383,"59601":39372,"59602":39603,"59603":39660,"59604":39659,"59605":39667,"59606":39666,"59607":39665,"59608":39750,"59609":39747,"59610":39783,"59611":39796,"59612":39793,"59613":39782,"59614":39798,"59615":39797,"59616":39792,"59617":39784,"59618":39780,"59619":39788,"59620":40188,"59621":40186,"59622":40189,"59623":40191,"59624":40183,"59625":40199,"59626":40192,"59627":40185,"59628":40187,"59629":40200,"59630":40197,"59631":40196,"59632":40579,"59633":40659,"59634":40719,"59635":40720,"59636":20764,"59637":20755,"59638":20759,"59639":20762,"59640":20753,"59641":20958,"59642":21300,"59643":21473,"59644":22128,"59645":22112,"59646":22126,"59712":22131,"59713":22118,"59714":22115,"59715":22125,"59716":22130,"59717":22110,"59718":22135,"59719":22300,"59720":22299,"59721":22728,"59722":22717,"59723":22729,"59724":22719,"59725":22714,"59726":22722,"59727":22716,"59728":22726,"59729":23319,"59730":23321,"59731":23323,"59732":23329,"59733":23316,"59734":23315,"59735":23312,"59736":23318,"59737":23336,"59738":23322,"59739":23328,"59740":23326,"59741":23535,"59742":23980,"59743":23985,"59744":23977,"59745":23975,"59746":23989,"59747":23984,"59748":23982,"59749":23978,"59750":23976,"59751":23986,"59752":23981,"59753":23983,"59754":23988,"59755":24167,"59756":24168,"59757":24166,"59758":24175,"59759":24297,"59760":24295,"59761":24294,"59762":24296,"59763":24293,"59764":24395,"59765":24508,"59766":24989,"59767":25000,"59768":24982,"59769":25029,"59770":25012,"59771":25030,"59772":25025,"59773":25036,"59774":25018,"59809":25023,"59810":25016,"59811":24972,"59812":25815,"59813":25814,"59814":25808,"59815":25807,"59816":25801,"59817":25789,"59818":25737,"59819":25795,"59820":25819,"59821":25843,"59822":25817,"59823":25907,"59824":25983,"59825":25980,"59826":26018,"59827":26312,"59828":26302,"59829":26304,"59830":26314,"59831":26315,"59832":26319,"59833":26301,"59834":26299,"59835":26298,"59836":26316,"59837":26403,"59838":27188,"59839":27238,"59840":27209,"59841":27239,"59842":27186,"59843":27240,"59844":27198,"59845":27229,"59846":27245,"59847":27254,"59848":27227,"59849":27217,"59850":27176,"59851":27226,"59852":27195,"59853":27199,"59854":27201,"59855":27242,"59856":27236,"59857":27216,"59858":27215,"59859":27220,"59860":27247,"59861":27241,"59862":27232,"59863":27196,"59864":27230,"59865":27222,"59866":27221,"59867":27213,"59868":27214,"59869":27206,"59870":27477,"59871":27476,"59872":27478,"59873":27559,"59874":27562,"59875":27563,"59876":27592,"59877":27591,"59878":27652,"59879":27651,"59880":27654,"59881":28589,"59882":28619,"59883":28579,"59884":28615,"59885":28604,"59886":28622,"59887":28616,"59888":28510,"59889":28612,"59890":28605,"59891":28574,"59892":28618,"59893":28584,"59894":28676,"59895":28581,"59896":28590,"59897":28602,"59898":28588,"59899":28586,"59900":28623,"59901":28607,"59902":28600,"59968":28578,"59969":28617,"59970":28587,"59971":28621,"59972":28591,"59973":28594,"59974":28592,"59975":29125,"59976":29122,"59977":29119,"59978":29112,"59979":29142,"59980":29120,"59981":29121,"59982":29131,"59983":29140,"59984":29130,"59985":29127,"59986":29135,"59987":29117,"59988":29144,"59989":29116,"59990":29126,"59991":29146,"59992":29147,"59993":29341,"59994":29342,"59995":29545,"59996":29542,"59997":29543,"59998":29548,"59999":29541,"60000":29547,"60001":29546,"60002":29823,"60003":29850,"60004":29856,"60005":29844,"60006":29842,"60007":29845,"60008":29857,"60009":29963,"60010":30080,"60011":30255,"60012":30253,"60013":30257,"60014":30269,"60015":30259,"60016":30268,"60017":30261,"60018":30258,"60019":30256,"60020":30395,"60021":30438,"60022":30618,"60023":30621,"60024":30625,"60025":30620,"60026":30619,"60027":30626,"60028":30627,"60029":30613,"60030":30617,"60065":30615,"60066":30941,"60067":30953,"60068":30949,"60069":30954,"60070":30942,"60071":30947,"60072":30939,"60073":30945,"60074":30946,"60075":30957,"60076":30943,"60077":30944,"60078":31140,"60079":31300,"60080":31304,"60081":31303,"60082":31414,"60083":31416,"60084":31413,"60085":31409,"60086":31415,"60087":31710,"60088":31715,"60089":31719,"60090":31709,"60091":31701,"60092":31717,"60093":31706,"60094":31720,"60095":31737,"60096":31700,"60097":31722,"60098":31714,"60099":31708,"60100":31723,"60101":31704,"60102":31711,"60103":31954,"60104":31956,"60105":31959,"60106":31952,"60107":31953,"60108":32274,"60109":32289,"60110":32279,"60111":32268,"60112":32287,"60113":32288,"60114":32275,"60115":32270,"60116":32284,"60117":32277,"60118":32282,"60119":32290,"60120":32267,"60121":32271,"60122":32278,"60123":32269,"60124":32276,"60125":32293,"60126":32292,"60127":32579,"60128":32635,"60129":32636,"60130":32634,"60131":32689,"60132":32751,"60133":32810,"60134":32809,"60135":32876,"60136":33201,"60137":33190,"60138":33198,"60139":33209,"60140":33205,"60141":33195,"60142":33200,"60143":33196,"60144":33204,"60145":33202,"60146":33207,"60147":33191,"60148":33266,"60149":33365,"60150":33366,"60151":33367,"60152":34134,"60153":34117,"60154":34155,"60155":34125,"60156":34131,"60157":34145,"60158":34136,"60224":34112,"60225":34118,"60226":34148,"60227":34113,"60228":34146,"60229":34116,"60230":34129,"60231":34119,"60232":34147,"60233":34110,"60234":34139,"60235":34161,"60236":34126,"60237":34158,"60238":34165,"60239":34133,"60240":34151,"60241":34144,"60242":34188,"60243":34150,"60244":34141,"60245":34132,"60246":34149,"60247":34156,"60248":34403,"60249":34405,"60250":34404,"60251":34715,"60252":34703,"60253":34711,"60254":34707,"60255":34706,"60256":34696,"60257":34689,"60258":34710,"60259":34712,"60260":34681,"60261":34695,"60262":34723,"60263":34693,"60264":34704,"60265":34705,"60266":34717,"60267":34692,"60268":34708,"60269":34716,"60270":34714,"60271":34697,"60272":35102,"60273":35110,"60274":35120,"60275":35117,"60276":35118,"60277":35111,"60278":35121,"60279":35106,"60280":35113,"60281":35107,"60282":35119,"60283":35116,"60284":35103,"60285":35313,"60286":35552,"60321":35554,"60322":35570,"60323":35572,"60324":35573,"60325":35549,"60326":35604,"60327":35556,"60328":35551,"60329":35568,"60330":35528,"60331":35550,"60332":35553,"60333":35560,"60334":35583,"60335":35567,"60336":35579,"60337":35985,"60338":35986,"60339":35984,"60340":36085,"60341":36078,"60342":36081,"60343":36080,"60344":36083,"60345":36204,"60346":36206,"60347":36261,"60348":36263,"60349":36403,"60350":36414,"60351":36408,"60352":36416,"60353":36421,"60354":36406,"60355":36412,"60356":36413,"60357":36417,"60358":36400,"60359":36415,"60360":36541,"60361":36662,"60362":36654,"60363":36661,"60364":36658,"60365":36665,"60366":36663,"60367":36660,"60368":36982,"60369":36985,"60370":36987,"60371":36998,"60372":37114,"60373":37171,"60374":37173,"60375":37174,"60376":37267,"60377":37264,"60378":37265,"60379":37261,"60380":37263,"60381":37671,"60382":37662,"60383":37640,"60384":37663,"60385":37638,"60386":37647,"60387":37754,"60388":37688,"60389":37692,"60390":37659,"60391":37667,"60392":37650,"60393":37633,"60394":37702,"60395":37677,"60396":37646,"60397":37645,"60398":37579,"60399":37661,"60400":37626,"60401":37669,"60402":37651,"60403":37625,"60404":37623,"60405":37684,"60406":37634,"60407":37668,"60408":37631,"60409":37673,"60410":37689,"60411":37685,"60412":37674,"60413":37652,"60414":37644,"60480":37643,"60481":37630,"60482":37641,"60483":37632,"60484":37627,"60485":37654,"60486":38332,"60487":38349,"60488":38334,"60489":38329,"60490":38330,"60491":38326,"60492":38335,"60493":38325,"60494":38333,"60495":38569,"60496":38612,"60497":38667,"60498":38674,"60499":38672,"60500":38809,"60501":38807,"60502":38804,"60503":38896,"60504":38904,"60505":38965,"60506":38959,"60507":38962,"60508":39204,"60509":39199,"60510":39207,"60511":39209,"60512":39326,"60513":39406,"60514":39404,"60515":39397,"60516":39396,"60517":39408,"60518":39395,"60519":39402,"60520":39401,"60521":39399,"60522":39609,"60523":39615,"60524":39604,"60525":39611,"60526":39670,"60527":39674,"60528":39673,"60529":39671,"60530":39731,"60531":39808,"60532":39813,"60533":39815,"60534":39804,"60535":39806,"60536":39803,"60537":39810,"60538":39827,"60539":39826,"60540":39824,"60541":39802,"60542":39829,"60577":39805,"60578":39816,"60579":40229,"60580":40215,"60581":40224,"60582":40222,"60583":40212,"60584":40233,"60585":40221,"60586":40216,"60587":40226,"60588":40208,"60589":40217,"60590":40223,"60591":40584,"60592":40582,"60593":40583,"60594":40622,"60595":40621,"60596":40661,"60597":40662,"60598":40698,"60599":40722,"60600":40765,"60601":20774,"60602":20773,"60603":20770,"60604":20772,"60605":20768,"60606":20777,"60607":21236,"60608":22163,"60609":22156,"60610":22157,"60611":22150,"60612":22148,"60613":22147,"60614":22142,"60615":22146,"60616":22143,"60617":22145,"60618":22742,"60619":22740,"60620":22735,"60621":22738,"60622":23341,"60623":23333,"60624":23346,"60625":23331,"60626":23340,"60627":23335,"60628":23334,"60629":23343,"60630":23342,"60631":23419,"60632":23537,"60633":23538,"60634":23991,"60635":24172,"60636":24170,"60637":24510,"60638":24507,"60639":25027,"60640":25013,"60641":25020,"60642":25063,"60643":25056,"60644":25061,"60645":25060,"60646":25064,"60647":25054,"60648":25839,"60649":25833,"60650":25827,"60651":25835,"60652":25828,"60653":25832,"60654":25985,"60655":25984,"60656":26038,"60657":26074,"60658":26322,"60659":27277,"60660":27286,"60661":27265,"60662":27301,"60663":27273,"60664":27295,"60665":27291,"60666":27297,"60667":27294,"60668":27271,"60669":27283,"60670":27278,"60736":27285,"60737":27267,"60738":27304,"60739":27300,"60740":27281,"60741":27263,"60742":27302,"60743":27290,"60744":27269,"60745":27276,"60746":27282,"60747":27483,"60748":27565,"60749":27657,"60750":28620,"60751":28585,"60752":28660,"60753":28628,"60754":28643,"60755":28636,"60756":28653,"60757":28647,"60758":28646,"60759":28638,"60760":28658,"60761":28637,"60762":28642,"60763":28648,"60764":29153,"60765":29169,"60766":29160,"60767":29170,"60768":29156,"60769":29168,"60770":29154,"60771":29555,"60772":29550,"60773":29551,"60774":29847,"60775":29874,"60776":29867,"60777":29840,"60778":29866,"60779":29869,"60780":29873,"60781":29861,"60782":29871,"60783":29968,"60784":29969,"60785":29970,"60786":29967,"60787":30084,"60788":30275,"60789":30280,"60790":30281,"60791":30279,"60792":30372,"60793":30441,"60794":30645,"60795":30635,"60796":30642,"60797":30647,"60798":30646,"60833":30644,"60834":30641,"60835":30632,"60836":30704,"60837":30963,"60838":30973,"60839":30978,"60840":30971,"60841":30972,"60842":30962,"60843":30981,"60844":30969,"60845":30974,"60846":30980,"60847":31147,"60848":31144,"60849":31324,"60850":31323,"60851":31318,"60852":31320,"60853":31316,"60854":31322,"60855":31422,"60856":31424,"60857":31425,"60858":31749,"60859":31759,"60860":31730,"60861":31744,"60862":31743,"60863":31739,"60864":31758,"60865":31732,"60866":31755,"60867":31731,"60868":31746,"60869":31753,"60870":31747,"60871":31745,"60872":31736,"60873":31741,"60874":31750,"60875":31728,"60876":31729,"60877":31760,"60878":31754,"60879":31976,"60880":32301,"60881":32316,"60882":32322,"60883":32307,"60884":38984,"60885":32312,"60886":32298,"60887":32329,"60888":32320,"60889":32327,"60890":32297,"60891":32332,"60892":32304,"60893":32315,"60894":32310,"60895":32324,"60896":32314,"60897":32581,"60898":32639,"60899":32638,"60900":32637,"60901":32756,"60902":32754,"60903":32812,"60904":33211,"60905":33220,"60906":33228,"60907":33226,"60908":33221,"60909":33223,"60910":33212,"60911":33257,"60912":33371,"60913":33370,"60914":33372,"60915":34179,"60916":34176,"60917":34191,"60918":34215,"60919":34197,"60920":34208,"60921":34187,"60922":34211,"60923":34171,"60924":34212,"60925":34202,"60926":34206,"60992":34167,"60993":34172,"60994":34185,"60995":34209,"60996":34170,"60997":34168,"60998":34135,"60999":34190,"61000":34198,"61001":34182,"61002":34189,"61003":34201,"61004":34205,"61005":34177,"61006":34210,"61007":34178,"61008":34184,"61009":34181,"61010":34169,"61011":34166,"61012":34200,"61013":34192,"61014":34207,"61015":34408,"61016":34750,"61017":34730,"61018":34733,"61019":34757,"61020":34736,"61021":34732,"61022":34745,"61023":34741,"61024":34748,"61025":34734,"61026":34761,"61027":34755,"61028":34754,"61029":34764,"61030":34743,"61031":34735,"61032":34756,"61033":34762,"61034":34740,"61035":34742,"61036":34751,"61037":34744,"61038":34749,"61039":34782,"61040":34738,"61041":35125,"61042":35123,"61043":35132,"61044":35134,"61045":35137,"61046":35154,"61047":35127,"61048":35138,"61049":35245,"61050":35247,"61051":35246,"61052":35314,"61053":35315,"61054":35614,"61089":35608,"61090":35606,"61091":35601,"61092":35589,"61093":35595,"61094":35618,"61095":35599,"61096":35602,"61097":35605,"61098":35591,"61099":35597,"61100":35592,"61101":35590,"61102":35612,"61103":35603,"61104":35610,"61105":35919,"61106":35952,"61107":35954,"61108":35953,"61109":35951,"61110":35989,"61111":35988,"61112":36089,"61113":36207,"61114":36430,"61115":36429,"61116":36435,"61117":36432,"61118":36428,"61119":36423,"61120":36675,"61121":36672,"61122":36997,"61123":36990,"61124":37176,"61125":37274,"61126":37282,"61127":37275,"61128":37273,"61129":37279,"61130":37281,"61131":37277,"61132":37280,"61133":37793,"61134":37763,"61135":37807,"61136":37732,"61137":37718,"61138":37703,"61139":37756,"61140":37720,"61141":37724,"61142":37750,"61143":37705,"61144":37712,"61145":37713,"61146":37728,"61147":37741,"61148":37775,"61149":37708,"61150":37738,"61151":37753,"61152":37719,"61153":37717,"61154":37714,"61155":37711,"61156":37745,"61157":37751,"61158":37755,"61159":37729,"61160":37726,"61161":37731,"61162":37735,"61163":37760,"61164":37710,"61165":37721,"61166":38343,"61167":38336,"61168":38345,"61169":38339,"61170":38341,"61171":38327,"61172":38574,"61173":38576,"61174":38572,"61175":38688,"61176":38687,"61177":38680,"61178":38685,"61179":38681,"61180":38810,"61181":38817,"61182":38812,"61248":38814,"61249":38813,"61250":38869,"61251":38868,"61252":38897,"61253":38977,"61254":38980,"61255":38986,"61256":38985,"61257":38981,"61258":38979,"61259":39205,"61260":39211,"61261":39212,"61262":39210,"61263":39219,"61264":39218,"61265":39215,"61266":39213,"61267":39217,"61268":39216,"61269":39320,"61270":39331,"61271":39329,"61272":39426,"61273":39418,"61274":39412,"61275":39415,"61276":39417,"61277":39416,"61278":39414,"61279":39419,"61280":39421,"61281":39422,"61282":39420,"61283":39427,"61284":39614,"61285":39678,"61286":39677,"61287":39681,"61288":39676,"61289":39752,"61290":39834,"61291":39848,"61292":39838,"61293":39835,"61294":39846,"61295":39841,"61296":39845,"61297":39844,"61298":39814,"61299":39842,"61300":39840,"61301":39855,"61302":40243,"61303":40257,"61304":40295,"61305":40246,"61306":40238,"61307":40239,"61308":40241,"61309":40248,"61310":40240,"61345":40261,"61346":40258,"61347":40259,"61348":40254,"61349":40247,"61350":40256,"61351":40253,"61352":32757,"61353":40237,"61354":40586,"61355":40585,"61356":40589,"61357":40624,"61358":40648,"61359":40666,"61360":40699,"61361":40703,"61362":40740,"61363":40739,"61364":40738,"61365":40788,"61366":40864,"61367":20785,"61368":20781,"61369":20782,"61370":22168,"61371":22172,"61372":22167,"61373":22170,"61374":22173,"61375":22169,"61376":22896,"61377":23356,"61378":23657,"61379":23658,"61380":24000,"61381":24173,"61382":24174,"61383":25048,"61384":25055,"61385":25069,"61386":25070,"61387":25073,"61388":25066,"61389":25072,"61390":25067,"61391":25046,"61392":25065,"61393":25855,"61394":25860,"61395":25853,"61396":25848,"61397":25857,"61398":25859,"61399":25852,"61400":26004,"61401":26075,"61402":26330,"61403":26331,"61404":26328,"61405":27333,"61406":27321,"61407":27325,"61408":27361,"61409":27334,"61410":27322,"61411":27318,"61412":27319,"61413":27335,"61414":27316,"61415":27309,"61416":27486,"61417":27593,"61418":27659,"61419":28679,"61420":28684,"61421":28685,"61422":28673,"61423":28677,"61424":28692,"61425":28686,"61426":28671,"61427":28672,"61428":28667,"61429":28710,"61430":28668,"61431":28663,"61432":28682,"61433":29185,"61434":29183,"61435":29177,"61436":29187,"61437":29181,"61438":29558,"61504":29880,"61505":29888,"61506":29877,"61507":29889,"61508":29886,"61509":29878,"61510":29883,"61511":29890,"61512":29972,"61513":29971,"61514":30300,"61515":30308,"61516":30297,"61517":30288,"61518":30291,"61519":30295,"61520":30298,"61521":30374,"61522":30397,"61523":30444,"61524":30658,"61525":30650,"61526":30975,"61527":30988,"61528":30995,"61529":30996,"61530":30985,"61531":30992,"61532":30994,"61533":30993,"61534":31149,"61535":31148,"61536":31327,"61537":31772,"61538":31785,"61539":31769,"61540":31776,"61541":31775,"61542":31789,"61543":31773,"61544":31782,"61545":31784,"61546":31778,"61547":31781,"61548":31792,"61549":32348,"61550":32336,"61551":32342,"61552":32355,"61553":32344,"61554":32354,"61555":32351,"61556":32337,"61557":32352,"61558":32343,"61559":32339,"61560":32693,"61561":32691,"61562":32759,"61563":32760,"61564":32885,"61565":33233,"61566":33234,"61601":33232,"61602":33375,"61603":33374,"61604":34228,"61605":34246,"61606":34240,"61607":34243,"61608":34242,"61609":34227,"61610":34229,"61611":34237,"61612":34247,"61613":34244,"61614":34239,"61615":34251,"61616":34254,"61617":34248,"61618":34245,"61619":34225,"61620":34230,"61621":34258,"61622":34340,"61623":34232,"61624":34231,"61625":34238,"61626":34409,"61627":34791,"61628":34790,"61629":34786,"61630":34779,"61631":34795,"61632":34794,"61633":34789,"61634":34783,"61635":34803,"61636":34788,"61637":34772,"61638":34780,"61639":34771,"61640":34797,"61641":34776,"61642":34787,"61643":34724,"61644":34775,"61645":34777,"61646":34817,"61647":34804,"61648":34792,"61649":34781,"61650":35155,"61651":35147,"61652":35151,"61653":35148,"61654":35142,"61655":35152,"61656":35153,"61657":35145,"61658":35626,"61659":35623,"61660":35619,"61661":35635,"61662":35632,"61663":35637,"61664":35655,"61665":35631,"61666":35644,"61667":35646,"61668":35633,"61669":35621,"61670":35639,"61671":35622,"61672":35638,"61673":35630,"61674":35620,"61675":35643,"61676":35645,"61677":35642,"61678":35906,"61679":35957,"61680":35993,"61681":35992,"61682":35991,"61683":36094,"61684":36100,"61685":36098,"61686":36096,"61687":36444,"61688":36450,"61689":36448,"61690":36439,"61691":36438,"61692":36446,"61693":36453,"61694":36455,"61760":36443,"61761":36442,"61762":36449,"61763":36445,"61764":36457,"61765":36436,"61766":36678,"61767":36679,"61768":36680,"61769":36683,"61770":37160,"61771":37178,"61772":37179,"61773":37182,"61774":37288,"61775":37285,"61776":37287,"61777":37295,"61778":37290,"61779":37813,"61780":37772,"61781":37778,"61782":37815,"61783":37787,"61784":37789,"61785":37769,"61786":37799,"61787":37774,"61788":37802,"61789":37790,"61790":37798,"61791":37781,"61792":37768,"61793":37785,"61794":37791,"61795":37773,"61796":37809,"61797":37777,"61798":37810,"61799":37796,"61800":37800,"61801":37812,"61802":37795,"61803":37797,"61804":38354,"61805":38355,"61806":38353,"61807":38579,"61808":38615,"61809":38618,"61810":24002,"61811":38623,"61812":38616,"61813":38621,"61814":38691,"61815":38690,"61816":38693,"61817":38828,"61818":38830,"61819":38824,"61820":38827,"61821":38820,"61822":38826,"61857":38818,"61858":38821,"61859":38871,"61860":38873,"61861":38870,"61862":38872,"61863":38906,"61864":38992,"61865":38993,"61866":38994,"61867":39096,"61868":39233,"61869":39228,"61870":39226,"61871":39439,"61872":39435,"61873":39433,"61874":39437,"61875":39428,"61876":39441,"61877":39434,"61878":39429,"61879":39431,"61880":39430,"61881":39616,"61882":39644,"61883":39688,"61884":39684,"61885":39685,"61886":39721,"61887":39733,"61888":39754,"61889":39756,"61890":39755,"61891":39879,"61892":39878,"61893":39875,"61894":39871,"61895":39873,"61896":39861,"61897":39864,"61898":39891,"61899":39862,"61900":39876,"61901":39865,"61902":39869,"61903":40284,"61904":40275,"61905":40271,"61906":40266,"61907":40283,"61908":40267,"61909":40281,"61910":40278,"61911":40268,"61912":40279,"61913":40274,"61914":40276,"61915":40287,"61916":40280,"61917":40282,"61918":40590,"61919":40588,"61920":40671,"61921":40705,"61922":40704,"61923":40726,"61924":40741,"61925":40747,"61926":40746,"61927":40745,"61928":40744,"61929":40780,"61930":40789,"61931":20788,"61932":20789,"61933":21142,"61934":21239,"61935":21428,"61936":22187,"61937":22189,"61938":22182,"61939":22183,"61940":22186,"61941":22188,"61942":22746,"61943":22749,"61944":22747,"61945":22802,"61946":23357,"61947":23358,"61948":23359,"61949":24003,"61950":24176,"62016":24511,"62017":25083,"62018":25863,"62019":25872,"62020":25869,"62021":25865,"62022":25868,"62023":25870,"62024":25988,"62025":26078,"62026":26077,"62027":26334,"62028":27367,"62029":27360,"62030":27340,"62031":27345,"62032":27353,"62033":27339,"62034":27359,"62035":27356,"62036":27344,"62037":27371,"62038":27343,"62039":27341,"62040":27358,"62041":27488,"62042":27568,"62043":27660,"62044":28697,"62045":28711,"62046":28704,"62047":28694,"62048":28715,"62049":28705,"62050":28706,"62051":28707,"62052":28713,"62053":28695,"62054":28708,"62055":28700,"62056":28714,"62057":29196,"62058":29194,"62059":29191,"62060":29186,"62061":29189,"62062":29349,"62063":29350,"62064":29348,"62065":29347,"62066":29345,"62067":29899,"62068":29893,"62069":29879,"62070":29891,"62071":29974,"62072":30304,"62073":30665,"62074":30666,"62075":30660,"62076":30705,"62077":31005,"62078":31003,"62113":31009,"62114":31004,"62115":30999,"62116":31006,"62117":31152,"62118":31335,"62119":31336,"62120":31795,"62121":31804,"62122":31801,"62123":31788,"62124":31803,"62125":31980,"62126":31978,"62127":32374,"62128":32373,"62129":32376,"62130":32368,"62131":32375,"62132":32367,"62133":32378,"62134":32370,"62135":32372,"62136":32360,"62137":32587,"62138":32586,"62139":32643,"62140":32646,"62141":32695,"62142":32765,"62143":32766,"62144":32888,"62145":33239,"62146":33237,"62147":33380,"62148":33377,"62149":33379,"62150":34283,"62151":34289,"62152":34285,"62153":34265,"62154":34273,"62155":34280,"62156":34266,"62157":34263,"62158":34284,"62159":34290,"62160":34296,"62161":34264,"62162":34271,"62163":34275,"62164":34268,"62165":34257,"62166":34288,"62167":34278,"62168":34287,"62169":34270,"62170":34274,"62171":34816,"62172":34810,"62173":34819,"62174":34806,"62175":34807,"62176":34825,"62177":34828,"62178":34827,"62179":34822,"62180":34812,"62181":34824,"62182":34815,"62183":34826,"62184":34818,"62185":35170,"62186":35162,"62187":35163,"62188":35159,"62189":35169,"62190":35164,"62191":35160,"62192":35165,"62193":35161,"62194":35208,"62195":35255,"62196":35254,"62197":35318,"62198":35664,"62199":35656,"62200":35658,"62201":35648,"62202":35667,"62203":35670,"62204":35668,"62205":35659,"62206":35669,"62272":35665,"62273":35650,"62274":35666,"62275":35671,"62276":35907,"62277":35959,"62278":35958,"62279":35994,"62280":36102,"62281":36103,"62282":36105,"62283":36268,"62284":36266,"62285":36269,"62286":36267,"62287":36461,"62288":36472,"62289":36467,"62290":36458,"62291":36463,"62292":36475,"62293":36546,"62294":36690,"62295":36689,"62296":36687,"62297":36688,"62298":36691,"62299":36788,"62300":37184,"62301":37183,"62302":37296,"62303":37293,"62304":37854,"62305":37831,"62306":37839,"62307":37826,"62308":37850,"62309":37840,"62310":37881,"62311":37868,"62312":37836,"62313":37849,"62314":37801,"62315":37862,"62316":37834,"62317":37844,"62318":37870,"62319":37859,"62320":37845,"62321":37828,"62322":37838,"62323":37824,"62324":37842,"62325":37863,"62326":38269,"62327":38362,"62328":38363,"62329":38625,"62330":38697,"62331":38699,"62332":38700,"62333":38696,"62334":38694,"62369":38835,"62370":38839,"62371":38838,"62372":38877,"62373":38878,"62374":38879,"62375":39004,"62376":39001,"62377":39005,"62378":38999,"62379":39103,"62380":39101,"62381":39099,"62382":39102,"62383":39240,"62384":39239,"62385":39235,"62386":39334,"62387":39335,"62388":39450,"62389":39445,"62390":39461,"62391":39453,"62392":39460,"62393":39451,"62394":39458,"62395":39456,"62396":39463,"62397":39459,"62398":39454,"62399":39452,"62400":39444,"62401":39618,"62402":39691,"62403":39690,"62404":39694,"62405":39692,"62406":39735,"62407":39914,"62408":39915,"62409":39904,"62410":39902,"62411":39908,"62412":39910,"62413":39906,"62414":39920,"62415":39892,"62416":39895,"62417":39916,"62418":39900,"62419":39897,"62420":39909,"62421":39893,"62422":39905,"62423":39898,"62424":40311,"62425":40321,"62426":40330,"62427":40324,"62428":40328,"62429":40305,"62430":40320,"62431":40312,"62432":40326,"62433":40331,"62434":40332,"62435":40317,"62436":40299,"62437":40308,"62438":40309,"62439":40304,"62440":40297,"62441":40325,"62442":40307,"62443":40315,"62444":40322,"62445":40303,"62446":40313,"62447":40319,"62448":40327,"62449":40296,"62450":40596,"62451":40593,"62452":40640,"62453":40700,"62454":40749,"62455":40768,"62456":40769,"62457":40781,"62458":40790,"62459":40791,"62460":40792,"62461":21303,"62462":22194,"62528":22197,"62529":22195,"62530":22755,"62531":23365,"62532":24006,"62533":24007,"62534":24302,"62535":24303,"62536":24512,"62537":24513,"62538":25081,"62539":25879,"62540":25878,"62541":25877,"62542":25875,"62543":26079,"62544":26344,"62545":26339,"62546":26340,"62547":27379,"62548":27376,"62549":27370,"62550":27368,"62551":27385,"62552":27377,"62553":27374,"62554":27375,"62555":28732,"62556":28725,"62557":28719,"62558":28727,"62559":28724,"62560":28721,"62561":28738,"62562":28728,"62563":28735,"62564":28730,"62565":28729,"62566":28736,"62567":28731,"62568":28723,"62569":28737,"62570":29203,"62571":29204,"62572":29352,"62573":29565,"62574":29564,"62575":29882,"62576":30379,"62577":30378,"62578":30398,"62579":30445,"62580":30668,"62581":30670,"62582":30671,"62583":30669,"62584":30706,"62585":31013,"62586":31011,"62587":31015,"62588":31016,"62589":31012,"62590":31017,"62625":31154,"62626":31342,"62627":31340,"62628":31341,"62629":31479,"62630":31817,"62631":31816,"62632":31818,"62633":31815,"62634":31813,"62635":31982,"62636":32379,"62637":32382,"62638":32385,"62639":32384,"62640":32698,"62641":32767,"62642":32889,"62643":33243,"62644":33241,"62645":33291,"62646":33384,"62647":33385,"62648":34338,"62649":34303,"62650":34305,"62651":34302,"62652":34331,"62653":34304,"62654":34294,"62655":34308,"62656":34313,"62657":34309,"62658":34316,"62659":34301,"62660":34841,"62661":34832,"62662":34833,"62663":34839,"62664":34835,"62665":34838,"62666":35171,"62667":35174,"62668":35257,"62669":35319,"62670":35680,"62671":35690,"62672":35677,"62673":35688,"62674":35683,"62675":35685,"62676":35687,"62677":35693,"62678":36270,"62679":36486,"62680":36488,"62681":36484,"62682":36697,"62683":36694,"62684":36695,"62685":36693,"62686":36696,"62687":36698,"62688":37005,"62689":37187,"62690":37185,"62691":37303,"62692":37301,"62693":37298,"62694":37299,"62695":37899,"62696":37907,"62697":37883,"62698":37920,"62699":37903,"62700":37908,"62701":37886,"62702":37909,"62703":37904,"62704":37928,"62705":37913,"62706":37901,"62707":37877,"62708":37888,"62709":37879,"62710":37895,"62711":37902,"62712":37910,"62713":37906,"62714":37882,"62715":37897,"62716":37880,"62717":37898,"62718":37887,"62784":37884,"62785":37900,"62786":37878,"62787":37905,"62788":37894,"62789":38366,"62790":38368,"62791":38367,"62792":38702,"62793":38703,"62794":38841,"62795":38843,"62796":38909,"62797":38910,"62798":39008,"62799":39010,"62800":39011,"62801":39007,"62802":39105,"62803":39106,"62804":39248,"62805":39246,"62806":39257,"62807":39244,"62808":39243,"62809":39251,"62810":39474,"62811":39476,"62812":39473,"62813":39468,"62814":39466,"62815":39478,"62816":39465,"62817":39470,"62818":39480,"62819":39469,"62820":39623,"62821":39626,"62822":39622,"62823":39696,"62824":39698,"62825":39697,"62826":39947,"62827":39944,"62828":39927,"62829":39941,"62830":39954,"62831":39928,"62832":40000,"62833":39943,"62834":39950,"62835":39942,"62836":39959,"62837":39956,"62838":39945,"62839":40351,"62840":40345,"62841":40356,"62842":40349,"62843":40338,"62844":40344,"62845":40336,"62846":40347,"62881":40352,"62882":40340,"62883":40348,"62884":40362,"62885":40343,"62886":40353,"62887":40346,"62888":40354,"62889":40360,"62890":40350,"62891":40355,"62892":40383,"62893":40361,"62894":40342,"62895":40358,"62896":40359,"62897":40601,"62898":40603,"62899":40602,"62900":40677,"62901":40676,"62902":40679,"62903":40678,"62904":40752,"62905":40750,"62906":40795,"62907":40800,"62908":40798,"62909":40797,"62910":40793,"62911":40849,"62912":20794,"62913":20793,"62914":21144,"62915":21143,"62916":22211,"62917":22205,"62918":22206,"62919":23368,"62920":23367,"62921":24011,"62922":24015,"62923":24305,"62924":25085,"62925":25883,"62926":27394,"62927":27388,"62928":27395,"62929":27384,"62930":27392,"62931":28739,"62932":28740,"62933":28746,"62934":28744,"62935":28745,"62936":28741,"62937":28742,"62938":29213,"62939":29210,"62940":29209,"62941":29566,"62942":29975,"62943":30314,"62944":30672,"62945":31021,"62946":31025,"62947":31023,"62948":31828,"62949":31827,"62950":31986,"62951":32394,"62952":32391,"62953":32392,"62954":32395,"62955":32390,"62956":32397,"62957":32589,"62958":32699,"62959":32816,"62960":33245,"62961":34328,"62962":34346,"62963":34342,"62964":34335,"62965":34339,"62966":34332,"62967":34329,"62968":34343,"62969":34350,"62970":34337,"62971":34336,"62972":34345,"62973":34334,"62974":34341,"63040":34857,"63041":34845,"63042":34843,"63043":34848,"63044":34852,"63045":34844,"63046":34859,"63047":34890,"63048":35181,"63049":35177,"63050":35182,"63051":35179,"63052":35322,"63053":35705,"63054":35704,"63055":35653,"63056":35706,"63057":35707,"63058":36112,"63059":36116,"63060":36271,"63061":36494,"63062":36492,"63063":36702,"63064":36699,"63065":36701,"63066":37190,"63067":37188,"63068":37189,"63069":37305,"63070":37951,"63071":37947,"63072":37942,"63073":37929,"63074":37949,"63075":37948,"63076":37936,"63077":37945,"63078":37930,"63079":37943,"63080":37932,"63081":37952,"63082":37937,"63083":38373,"63084":38372,"63085":38371,"63086":38709,"63087":38714,"63088":38847,"63089":38881,"63090":39012,"63091":39113,"63092":39110,"63093":39104,"63094":39256,"63095":39254,"63096":39481,"63097":39485,"63098":39494,"63099":39492,"63100":39490,"63101":39489,"63102":39482,"63137":39487,"63138":39629,"63139":39701,"63140":39703,"63141":39704,"63142":39702,"63143":39738,"63144":39762,"63145":39979,"63146":39965,"63147":39964,"63148":39980,"63149":39971,"63150":39976,"63151":39977,"63152":39972,"63153":39969,"63154":40375,"63155":40374,"63156":40380,"63157":40385,"63158":40391,"63159":40394,"63160":40399,"63161":40382,"63162":40389,"63163":40387,"63164":40379,"63165":40373,"63166":40398,"63167":40377,"63168":40378,"63169":40364,"63170":40392,"63171":40369,"63172":40365,"63173":40396,"63174":40371,"63175":40397,"63176":40370,"63177":40570,"63178":40604,"63179":40683,"63180":40686,"63181":40685,"63182":40731,"63183":40728,"63184":40730,"63185":40753,"63186":40782,"63187":40805,"63188":40804,"63189":40850,"63190":20153,"63191":22214,"63192":22213,"63193":22219,"63194":22897,"63195":23371,"63196":23372,"63197":24021,"63198":24017,"63199":24306,"63200":25889,"63201":25888,"63202":25894,"63203":25890,"63204":27403,"63205":27400,"63206":27401,"63207":27661,"63208":28757,"63209":28758,"63210":28759,"63211":28754,"63212":29214,"63213":29215,"63214":29353,"63215":29567,"63216":29912,"63217":29909,"63218":29913,"63219":29911,"63220":30317,"63221":30381,"63222":31029,"63223":31156,"63224":31344,"63225":31345,"63226":31831,"63227":31836,"63228":31833,"63229":31835,"63230":31834,"63296":31988,"63297":31985,"63298":32401,"63299":32591,"63300":32647,"63301":33246,"63302":33387,"63303":34356,"63304":34357,"63305":34355,"63306":34348,"63307":34354,"63308":34358,"63309":34860,"63310":34856,"63311":34854,"63312":34858,"63313":34853,"63314":35185,"63315":35263,"63316":35262,"63317":35323,"63318":35710,"63319":35716,"63320":35714,"63321":35718,"63322":35717,"63323":35711,"63324":36117,"63325":36501,"63326":36500,"63327":36506,"63328":36498,"63329":36496,"63330":36502,"63331":36503,"63332":36704,"63333":36706,"63334":37191,"63335":37964,"63336":37968,"63337":37962,"63338":37963,"63339":37967,"63340":37959,"63341":37957,"63342":37960,"63343":37961,"63344":37958,"63345":38719,"63346":38883,"63347":39018,"63348":39017,"63349":39115,"63350":39252,"63351":39259,"63352":39502,"63353":39507,"63354":39508,"63355":39500,"63356":39503,"63357":39496,"63358":39498,"63393":39497,"63394":39506,"63395":39504,"63396":39632,"63397":39705,"63398":39723,"63399":39739,"63400":39766,"63401":39765,"63402":40006,"63403":40008,"63404":39999,"63405":40004,"63406":39993,"63407":39987,"63408":40001,"63409":39996,"63410":39991,"63411":39988,"63412":39986,"63413":39997,"63414":39990,"63415":40411,"63416":40402,"63417":40414,"63418":40410,"63419":40395,"63420":40400,"63421":40412,"63422":40401,"63423":40415,"63424":40425,"63425":40409,"63426":40408,"63427":40406,"63428":40437,"63429":40405,"63430":40413,"63431":40630,"63432":40688,"63433":40757,"63434":40755,"63435":40754,"63436":40770,"63437":40811,"63438":40853,"63439":40866,"63440":20797,"63441":21145,"63442":22760,"63443":22759,"63444":22898,"63445":23373,"63446":24024,"63447":34863,"63448":24399,"63449":25089,"63450":25091,"63451":25092,"63452":25897,"63453":25893,"63454":26006,"63455":26347,"63456":27409,"63457":27410,"63458":27407,"63459":27594,"63460":28763,"63461":28762,"63462":29218,"63463":29570,"63464":29569,"63465":29571,"63466":30320,"63467":30676,"63468":31847,"63469":31846,"63470":32405,"63471":33388,"63472":34362,"63473":34368,"63474":34361,"63475":34364,"63476":34353,"63477":34363,"63478":34366,"63479":34864,"63480":34866,"63481":34862,"63482":34867,"63483":35190,"63484":35188,"63485":35187,"63486":35326,"63552":35724,"63553":35726,"63554":35723,"63555":35720,"63556":35909,"63557":36121,"63558":36504,"63559":36708,"63560":36707,"63561":37308,"63562":37986,"63563":37973,"63564":37981,"63565":37975,"63566":37982,"63567":38852,"63568":38853,"63569":38912,"63570":39510,"63571":39513,"63572":39710,"63573":39711,"63574":39712,"63575":40018,"63576":40024,"63577":40016,"63578":40010,"63579":40013,"63580":40011,"63581":40021,"63582":40025,"63583":40012,"63584":40014,"63585":40443,"63586":40439,"63587":40431,"63588":40419,"63589":40427,"63590":40440,"63591":40420,"63592":40438,"63593":40417,"63594":40430,"63595":40422,"63596":40434,"63597":40432,"63598":40418,"63599":40428,"63600":40436,"63601":40435,"63602":40424,"63603":40429,"63604":40642,"63605":40656,"63606":40690,"63607":40691,"63608":40710,"63609":40732,"63610":40760,"63611":40759,"63612":40758,"63613":40771,"63614":40783,"63649":40817,"63650":40816,"63651":40814,"63652":40815,"63653":22227,"63654":22221,"63655":23374,"63656":23661,"63657":25901,"63658":26349,"63659":26350,"63660":27411,"63661":28767,"63662":28769,"63663":28765,"63664":28768,"63665":29219,"63666":29915,"63667":29925,"63668":30677,"63669":31032,"63670":31159,"63671":31158,"63672":31850,"63673":32407,"63674":32649,"63675":33389,"63676":34371,"63677":34872,"63678":34871,"63679":34869,"63680":34891,"63681":35732,"63682":35733,"63683":36510,"63684":36511,"63685":36512,"63686":36509,"63687":37310,"63688":37309,"63689":37314,"63690":37995,"63691":37992,"63692":37993,"63693":38629,"63694":38726,"63695":38723,"63696":38727,"63697":38855,"63698":38885,"63699":39518,"63700":39637,"63701":39769,"63702":40035,"63703":40039,"63704":40038,"63705":40034,"63706":40030,"63707":40032,"63708":40450,"63709":40446,"63710":40455,"63711":40451,"63712":40454,"63713":40453,"63714":40448,"63715":40449,"63716":40457,"63717":40447,"63718":40445,"63719":40452,"63720":40608,"63721":40734,"63722":40774,"63723":40820,"63724":40821,"63725":40822,"63726":22228,"63727":25902,"63728":26040,"63729":27416,"63730":27417,"63731":27415,"63732":27418,"63733":28770,"63734":29222,"63735":29354,"63736":30680,"63737":30681,"63738":31033,"63739":31849,"63740":31851,"63741":31990,"63742":32410,"63808":32408,"63809":32411,"63810":32409,"63811":33248,"63812":33249,"63813":34374,"63814":34375,"63815":34376,"63816":35193,"63817":35194,"63818":35196,"63819":35195,"63820":35327,"63821":35736,"63822":35737,"63823":36517,"63824":36516,"63825":36515,"63826":37998,"63827":37997,"63828":37999,"63829":38001,"63830":38003,"63831":38729,"63832":39026,"63833":39263,"63834":40040,"63835":40046,"63836":40045,"63837":40459,"63838":40461,"63839":40464,"63840":40463,"63841":40466,"63842":40465,"63843":40609,"63844":40693,"63845":40713,"63846":40775,"63847":40824,"63848":40827,"63849":40826,"63850":40825,"63851":22302,"63852":28774,"63853":31855,"63854":34876,"63855":36274,"63856":36518,"63857":37315,"63858":38004,"63859":38008,"63860":38006,"63861":38005,"63862":39520,"63863":40052,"63864":40051,"63865":40049,"63866":40053,"63867":40468,"63868":40467,"63869":40694,"63870":40714,"63905":40868,"63906":28776,"63907":28773,"63908":31991,"63909":34410,"63910":34878,"63911":34877,"63912":34879,"63913":35742,"63914":35996,"63915":36521,"63916":36553,"63917":38731,"63918":39027,"63919":39028,"63920":39116,"63921":39265,"63922":39339,"63923":39524,"63924":39526,"63925":39527,"63926":39716,"63927":40469,"63928":40471,"63929":40776,"63930":25095,"63931":27422,"63932":29223,"63933":34380,"63934":36520,"63935":38018,"63936":38016,"63937":38017,"63938":39529,"63939":39528,"63940":39726,"63941":40473,"63942":29225,"63943":34379,"63944":35743,"63945":38019,"63946":40057,"63947":40631,"63948":30325,"63949":39531,"63950":40058,"63951":40477,"63952":28777,"63953":28778,"63954":40612,"63955":40830,"63956":40777,"63957":40856,"63958":30849,"63959":37561,"63960":35023,"63961":22715,"63962":24658,"63963":31911,"63964":23290,"63965":9556,"63966":9574,"63967":9559,"63968":9568,"63969":9580,"63970":9571,"63971":9562,"63972":9577,"63973":9565,"63974":9554,"63975":9572,"63976":9557,"63977":9566,"63978":9578,"63979":9569,"63980":9560,"63981":9575,"63982":9563,"63983":9555,"63984":9573,"63985":9558,"63986":9567,"63987":9579,"63988":9570,"63989":9561,"63990":9576,"63991":9564,"63992":9553,"63993":9552,"63994":9581,"63995":9582,"63996":9584,"63997":9583,"63998":9619,"64064":57344,"64065":57345,"64066":57346,"64067":57347,"64068":57348,"64069":57349,"64070":57350,"64071":57351,"64072":57352,"64073":57353,"64074":57354,"64075":57355,"64076":57356,"64077":57357,"64078":57358,"64079":57359,"64080":57360,"64081":57361,"64082":57362,"64083":57363,"64084":57364,"64085":57365,"64086":57366,"64087":57367,"64088":57368,"64089":57369,"64090":57370,"64091":57371,"64092":57372,"64093":57373,"64094":57374,"64095":57375,"64096":57376,"64097":57377,"64098":57378,"64099":57379,"64100":29234,"64101":29244,"64102":29286,"64103":29314,"64104":29327,"64105":29343,"64106":29357,"64107":29361,"64108":29368,"64109":29374,"64110":29389,"64111":29403,"64112":29476,"64113":29487,"64114":29496,"64115":29497,"64116":29629,"64117":29646,"64118":29681,"64119":29814,"64120":29858,"64121":29953,"64122":29977,"64123":29987,"64124":30012,"64125":30020,"64126":30025,"64161":30029,"64162":30061,"64163":30082,"64164":30083,"64165":30089,"64166":30124,"64167":30166,"64168":30185,"64169":30272,"64170":30285,"64171":30292,"64172":30312,"64173":30336,"64174":30339,"64175":30352,"64176":30391,"64177":30393,"64178":30477,"64179":30494,"64180":30531,"64181":30744,"64182":30748,"64183":30777,"64184":30780,"64185":30791,"64186":30806,"64187":30842,"64188":30901,"64189":30905,"64190":30918,"64191":30937,"64192":30983,"64193":31024,"64194":31028,"64195":31035,"64196":31104,"64197":31133,"64198":31171,"64199":31201,"64200":31238,"64201":31246,"64202":31299,"64203":31312,"64204":31427,"64205":31442,"64206":31458,"64207":31463,"64208":31480,"64209":31542,"64210":31586,"64211":31596,"64212":31610,"64213":31611,"64214":31642,"64215":31646,"64216":31647,"64217":31650,"64218":31655,"64219":31734,"64220":31762,"64221":31764,"64222":31823,"64223":31830,"64224":31832,"64225":31915,"64226":31994,"64227":32072,"64228":32075,"64229":32119,"64230":32212,"64231":32213,"64232":32214,"64233":32228,"64234":32333,"64235":32349,"64236":32383,"64237":32393,"64238":32398,"64239":32402,"64240":32468,"64241":32497,"64242":32530,"64243":32560,"64244":32625,"64245":32642,"64246":32686,"64247":32710,"64248":32800,"64249":32802,"64250":32805,"64251":32817,"64252":32863,"64253":32872,"64254":32940,"64320":32951,"64321":20890,"64322":21526,"64323":21524,"64324":13535,"64325":19581,"64326":25283,"64327":57508,"64328":57509,"64329":57510,"64330":21707,"64331":57512,"64332":21948,"64333":32950,"64334":20903,"64335":57516,"64336":57517,"64337":57518,"64338":21779,"64339":33318,"64340":57521,"64341":21790,"64342":21982,"64343":25529,"64344":26776,"64345":57526,"64346":21762,"64347":21865,"64348":30132,"64349":25596,"64350":40580,"64351":37418,"64352":57533,"64353":57534,"64354":57535,"64355":35015,"64356":24734,"64357":22053,"64358":28997,"64359":23282,"64360":57541,"64361":21135,"64362":22095,"64363":30611,"64364":34694,"64365":36397,"64366":33206,"64367":13822,"64368":29174,"64369":57550,"64370":34820,"64371":37765,"64372":57553,"64373":57554,"64374":30310,"64375":57556,"64376":40050,"64377":57558,"64378":25294,"64379":57560,"64380":40598,"64381":18825,"64382":31955,"64417":36570,"64418":40619,"64419":25831,"64420":57567,"64421":33450,"64422":26471,"64423":28018,"64424":30982,"64425":31172,"64426":32590,"64427":34798,"64428":57575,"64429":33726,"64430":34351,"64431":35237,"64432":17935,"64433":57580,"64434":39112,"64435":39232,"64436":39245,"64437":39436,"64438":39639,"64439":40600,"64440":40742,"64441":57588,"64442":20227,"64443":57590,"64444":20281,"64445":20274,"64446":20395,"64447":20566,"64448":57595,"64449":20526,"64450":20646,"64451":20697,"64452":20750,"64453":20717,"64454":20737,"64455":20980,"64456":21023,"64457":21088,"64458":21079,"64459":21146,"64460":21201,"64461":21216,"64462":21217,"64463":20947,"64464":20959,"64465":30022,"64466":20990,"64467":21298,"64468":21292,"64469":21299,"64470":21419,"64471":21418,"64472":40846,"64473":21609,"64474":21660,"64475":21466,"64476":27338,"64477":21875,"64478":57625,"64479":13782,"64480":57627,"64481":22033,"64482":22093,"64483":57630,"64484":22100,"64485":13811,"64486":57633,"64487":22342,"64488":22394,"64489":22375,"64490":22586,"64491":22502,"64492":22493,"64493":22592,"64494":57641,"64495":22566,"64496":22748,"64497":22967,"64498":23001,"64499":23584,"64500":57647,"64501":23761,"64502":23785,"64503":23878,"64504":23950,"64505":57652,"64506":24053,"64507":24075,"64508":24082,"64509":24110,"64510":24158,"64576":57658,"64577":24397,"64578":31357,"64579":23491,"64580":31419,"64581":57663,"64582":57664,"64583":24484,"64584":24506,"64585":24508,"64586":57668,"64587":24695,"64588":24740,"64589":24755,"64590":24829,"64591":24880,"64592":57674,"64593":24988,"64594":24921,"64595":24957,"64596":24924,"64597":25471,"64598":25058,"64599":28885,"64600":25145,"64601":25192,"64602":25221,"64603":25218,"64604":25254,"64605":25301,"64606":25444,"64607":25397,"64608":25744,"64609":14940,"64610":26184,"64611":26215,"64612":26398,"64613":26627,"64614":26540,"64615":26617,"64616":26806,"64617":26924,"64618":26881,"64619":26880,"64620":26826,"64621":26995,"64622":27008,"64623":26942,"64624":57706,"64625":27058,"64626":27072,"64627":27018,"64628":27130,"64629":27113,"64630":27314,"64631":27218,"64632":27293,"64633":27421,"64634":27474,"64635":27642,"64636":15569,"64637":27854,"64638":28239,"64673":28089,"64674":28484,"64675":57723,"64676":28634,"64677":28801,"64678":31180,"64679":28980,"64680":15820,"64681":29046,"64682":57730,"64683":57731,"64684":29205,"64685":29264,"64686":29319,"64687":29484,"64688":29362,"64689":29410,"64690":29442,"64691":29512,"64692":29480,"64693":29519,"64694":29553,"64695":25989,"64696":57744,"64697":29789,"64698":29800,"64699":29982,"64700":30035,"64701":30074,"64702":30369,"64703":30412,"64704":30500,"64705":30507,"64706":16485,"64707":30803,"64708":30931,"64709":30936,"64710":40318,"64711":30895,"64712":57760,"64713":24898,"64714":31145,"64715":39994,"64716":31188,"64717":57765,"64718":31277,"64719":31294,"64720":31305,"64721":31453,"64722":31450,"64723":30147,"64724":30215,"64725":30210,"64726":57774,"64727":30311,"64728":30319,"64729":22048,"64730":35431,"64731":40727,"64732":31519,"64733":31634,"64734":31651,"64735":31695,"64736":57784,"64737":31740,"64738":31810,"64739":31825,"64740":31837,"64741":31856,"64742":31870,"64743":31878,"64744":31875,"64745":31916,"64746":31943,"64747":31938,"64748":57796,"64749":31962,"64750":57798,"64751":32077,"64752":32090,"64753":32245,"64754":32295,"64755":32366,"64756":40597,"64757":21107,"64758":32797,"64759":32866,"64760":32867,"64761":32870,"64762":32859,"64763":32934,"64764":33027,"64765":40577,"64766":33224,"64832":57815,"64833":36768,"64834":33270,"64835":33306,"64836":57819,"64837":34673,"64838":34729,"64839":34700,"64840":40606,"64841":34753,"64842":40476,"64843":57826,"64844":34774,"64845":34805,"64846":34831,"64847":34840,"64848":34861,"64849":34882,"64850":34885,"64851":39989,"64852":34926,"64853":34986,"64854":34976,"64855":25245,"64856":35139,"64857":35149,"64858":29042,"64859":34910,"64860":57843,"64861":33533,"64862":17591,"64863":33488,"64864":33669,"64865":40194,"64866":40809,"64867":33824,"64868":57851,"64869":34010,"64870":33965,"64871":17659,"64872":34123,"64873":57856,"64874":34306,"64875":34320,"64876":25553,"64877":35209,"64878":35210,"64879":35220,"64880":40005,"64881":35260,"64882":35454,"64883":35401,"64884":35596,"64885":35651,"64886":35713,"64887":35660,"64888":57871,"64889":36013,"64890":36075,"64891":36087,"64892":36108,"64893":36226,"64894":36262,"64929":36308,"64930":36392,"64931":36431,"64932":36471,"64933":36469,"64934":36519,"64935":36633,"64936":57885,"64937":36700,"64938":40260,"64939":37060,"64940":37201,"64941":57890,"64942":37212,"64943":37209,"64944":37223,"64945":37244,"64946":37262,"64947":37307,"64948":40616,"64949":36950,"64950":36940,"64951":37374,"64952":37474,"64953":37566,"64954":37739,"64955":37742,"64956":37818,"64957":37927,"64958":38295,"64959":38311,"64960":57909,"64961":38456,"64962":57911,"64963":38531,"64964":38550,"64965":38529,"64966":38589,"64967":38659,"64968":38689,"64969":38705,"64970":38751,"64971":38815,"64972":38836,"64973":38840,"64974":38842,"64975":38846,"64976":38856,"64977":40639,"64978":38943,"64979":38958,"64980":40869,"64981":38983,"64982":38987,"64983":39014,"64984":39020,"64985":39092,"64986":40794,"64987":39132,"64988":39142,"64989":39234,"64990":39225,"64991":39227,"64992":40787,"64993":39242,"64994":40773,"64995":19326,"64996":39386,"64997":31432,"64998":39610,"64999":39613,"65000":40706,"65001":39722,"65002":57951,"65003":39725,"65004":39650,"65005":39682,"65006":39679,"65007":19463,"65008":39689,"65009":19460,"65010":19515,"65011":39823,"65012":39837,"65013":39856,"65014":39948,"65015":39957,"65016":39946,"65017":39935,"65018":39982,"65019":33000,"65020":33001,"65021":33004,"65022":33038,"65088":27705,"65089":20074,"65090":38465,"65091":22770,"65092":31074,"65093":26658,"65094":57978,"65095":57979,"65096":33031,"65097":22487,"65098":17642,"65099":25653,"65100":34100,"65101":16607,"65102":57986,"65103":26906,"65104":39938,"65105":30129,"65106":33747,"65107":29041,"65108":27147,"65109":57993,"65110":27258,"65111":39668,"65112":57996,"65113":57997,"65114":30649,"65115":25904,"65116":28054,"65117":22071,"65118":26405,"65119":27179,"65120":32093,"65121":36961,"65122":20120,"65123":31910,"65124":31545,"65125":58009,"65126":22901,"65127":14023,"65128":28799,"65129":58013,"65130":28299,"65131":58015,"65132":58016,"65133":38749,"65134":37584,"65135":22356,"65136":58020,"65137":16089,"65138":58022,"65139":58023,"65140":24985,"65141":29792,"65142":28991,"65143":31022,"65144":23190,"65145":37704,"65146":26254,"65147":20477,"65148":37697,"65149":13908,"65150":23925,"65185":28702,"65186":25979,"65187":28813,"65188":24269,"65189":58039,"65190":24743,"65191":31408,"65192":24419,"65193":58043,"65194":29687,"65195":58045,"65196":29800,"65197":30132,"65198":58048,"65199":39785,"65200":189,"65201":8531,"65202":8532,"65203":188,"65204":190,"65205":8533,"65206":8534,"65207":8535,"65208":8536,"65209":8537,"65210":8538,"65211":34450,"65212":34464,"65213":34477,"65214":34482,"65215":34725,"65216":34737,"65217":8539,"65218":8540,"65219":8541,"65220":8542,"65221":34778,"65222":34895,"65223":34912,"65224":34951,"65225":34959,"65226":34960,"65227":35046,"65228":35071,"65229":35072,"65230":35108,"65231":35143,"65232":35156,"65233":35173,"65234":35200,"65235":35217,"65236":35356,"65237":35369,"65238":35371,"65239":35384,"65240":35389,"65241":8978,"65242":35472,"65243":35476,"65244":35484,"65245":35497,"65246":35503,"65247":35508,"65248":35562,"65249":35615,"65250":8240,"65251":35647,"65252":35661,"65253":35678,"65254":35682,"65255":35689,"65256":35739,"65257":35921,"65258":35995,"65259":35999,"65260":36052,"65261":36054,"65262":33042,"65263":33073,"65264":33078,"65265":33119,"65266":33133,"65267":33149,"65268":33171,"65269":33194,"65270":33208,"65271":33217,"65272":33321,"65273":33325,"65274":33326,"65275":33342,"65276":33378,"65277":33386,"65278":33416,"NaN":null} -},{}],109:[function(require,module,exports){ -module.exports={33088:19970,33089:19972,33090:19973,33091:19974,33092:19983,33093:19986,33094:19991,33095:19999,33096:20000,33097:20001,33098:20003,33099:20006,33100:20009,33101:20014,33102:20015,33103:20017,33104:20019,33105:20021,33106:20023,33107:20028,33108:20032,33109:20033,33110:20034,33111:20036,33112:20038,33113:20042,33114:20049,33115:20053,33116:20055,33117:20058,33118:20059,33119:20066,33120:20067,33121:20068,33122:20069,33123:20071,33124:20072,33125:20074,33126:20075,33127:20076,33128:20077,33129:20078,33130:20079,33131:20082,33132:20084,33133:20085,33134:20086,33135:20087,33136:20088,33137:20089,33138:20090,33139:20091,33140:20092,33141:20093,33142:20095,33143:20096,33144:20097,33145:20098,33146:20099,33147:20100,33148:20101,33149:20103,33150:20106,33152:20112,33153:20118,33154:20119,33155:20121,33156:20124,33157:20125,33158:20126,33159:20131,33160:20138,33161:20143,33162:20144,33163:20145,33164:20148,33165:20150,33166:20151,33167:20152,33168:20153,33169:20156,33170:20157,33171:20158,33172:20168,33173:20172,33174:20175,33175:20176,33176:20178,33177:20186,33178:20187,33179:20188,33180:20192,33181:20194,33182:20198,33183:20199,33184:20201,33185:20205,33186:20206,33187:20207,33188:20209,33189:20212,33190:20216,33191:20217,33192:20218,33193:20220,33194:20222,33195:20224,33196:20226,33197:20227,33198:20228,33199:20229,33200:20230,33201:20231,33202:20232,33203:20235,33204:20236,33205:20242,33206:20243,33207:20244,33208:20245,33209:20246,33210:20252,33211:20253,33212:20257,33213:20259,33214:20264,33215:20265,33216:20268,33217:20269,33218:20270,33219:20273,33220:20275,33221:20277,33222:20279,33223:20281,33224:20283,33225:20286,33226:20287,33227:20288,33228:20289,33229:20290,33230:20292,33231:20293,33232:20295,33233:20296,33234:20297,33235:20298,33236:20299,33237:20300,33238:20306,33239:20308,33240:20310,33241:20321,33242:20322,33243:20326,33244:20328,33245:20330,33246:20331,33247:20333,33248:20334,33249:20337,33250:20338,33251:20341,33252:20343,33253:20344,33254:20345,33255:20346,33256:20349,33257:20352,33258:20353,33259:20354,33260:20357,33261:20358,33262:20359,33263:20362,33264:20364,33265:20366,33266:20368,33267:20370,33268:20371,33269:20373,33270:20374,33271:20376,33272:20377,33273:20378,33274:20380,33275:20382,33276:20383,33277:20385,33278:20386,33344:20388,33345:20395,33346:20397,33347:20400,33348:20401,33349:20402,33350:20403,33351:20404,33352:20406,33353:20407,33354:20408,33355:20409,33356:20410,33357:20411,33358:20412,33359:20413,33360:20414,33361:20416,33362:20417,33363:20418,33364:20422,33365:20423,33366:20424,33367:20425,33368:20427,33369:20428,33370:20429,33371:20434,33372:20435,33373:20436,33374:20437,33375:20438,33376:20441,33377:20443,33378:20448,33379:20450,33380:20452,33381:20453,33382:20455,33383:20459,33384:20460,33385:20464,33386:20466,33387:20468,33388:20469,33389:20470,33390:20471,33391:20473,33392:20475,33393:20476,33394:20477,33395:20479,33396:20480,33397:20481,33398:20482,33399:20483,33400:20484,33401:20485,33402:20486,33403:20487,33404:20488,33405:20489,33406:20490,33408:20491,33409:20494,33410:20496,33411:20497,33412:20499,33413:20501,33414:20502,33415:20503,33416:20507,33417:20509,33418:20510,33419:20512,33420:20514,33421:20515,33422:20516,33423:20519,33424:20523,33425:20527,33426:20528,33427:20529,33428:20530,33429:20531,33430:20532,33431:20533,33432:20534,33433:20535,33434:20536,33435:20537,33436:20539,33437:20541,33438:20543,33439:20544,33440:20545,33441:20546,33442:20548,33443:20549,33444:20550,33445:20553,33446:20554,33447:20555,33448:20557,33449:20560,33450:20561,33451:20562,33452:20563,33453:20564,33454:20566,33455:20567,33456:20568,33457:20569,33458:20571,33459:20573,33460:20574,33461:20575,33462:20576,33463:20577,33464:20578,33465:20579,33466:20580,33467:20582,33468:20583,33469:20584,33470:20585,33471:20586,33472:20587,33473:20589,33474:20590,33475:20591,33476:20592,33477:20593,33478:20594,33479:20595,33480:20596,33481:20597,33482:20600,33483:20601,33484:20602,33485:20604,33486:20605,33487:20609,33488:20610,33489:20611,33490:20612,33491:20614,33492:20615,33493:20617,33494:20618,33495:20619,33496:20620,33497:20622,33498:20623,33499:20624,33500:20625,33501:20626,33502:20627,33503:20628,33504:20629,33505:20630,33506:20631,33507:20632,33508:20633,33509:20634,33510:20635,33511:20636,33512:20637,33513:20638,33514:20639,33515:20640,33516:20641,33517:20642,33518:20644,33519:20646,33520:20650,33521:20651,33522:20653,33523:20654,33524:20655,33525:20656,33526:20657,33527:20659,33528:20660,33529:20661,33530:20662,33531:20663,33532:20664,33533:20665,33534:20668,33600:20669,33601:20670,33602:20671,33603:20672,33604:20673,33605:20674,33606:20675,33607:20676,33608:20677,33609:20678,33610:20679,33611:20680,33612:20681,33613:20682,33614:20683,33615:20684,33616:20685,33617:20686,33618:20688,33619:20689,33620:20690,33621:20691,33622:20692,33623:20693,33624:20695,33625:20696,33626:20697,33627:20699,33628:20700,33629:20701,33630:20702,33631:20703,33632:20704,33633:20705,33634:20706,33635:20707,33636:20708,33637:20709,33638:20712,33639:20713,33640:20714,33641:20715,33642:20719,33643:20720,33644:20721,33645:20722,33646:20724,33647:20726,33648:20727,33649:20728,33650:20729,33651:20730,33652:20732,33653:20733,33654:20734,33655:20735,33656:20736,33657:20737,33658:20738,33659:20739,33660:20740,33661:20741,33662:20744,33664:20745,33665:20746,33666:20748,33667:20749,33668:20750,33669:20751,33670:20752,33671:20753,33672:20755,33673:20756,33674:20757,33675:20758,33676:20759,33677:20760,33678:20761,33679:20762,33680:20763,33681:20764,33682:20765,33683:20766,33684:20767,33685:20768,33686:20770,33687:20771,33688:20772,33689:20773,33690:20774,33691:20775,33692:20776,33693:20777,33694:20778,33695:20779,33696:20780,33697:20781,33698:20782,33699:20783,33700:20784,33701:20785,33702:20786,33703:20787,33704:20788,33705:20789,33706:20790,33707:20791,33708:20792,33709:20793,33710:20794,33711:20795,33712:20796,33713:20797,33714:20798,33715:20802,33716:20807,33717:20810,33718:20812,33719:20814,33720:20815,33721:20816,33722:20818,33723:20819,33724:20823,33725:20824,33726:20825,33727:20827,33728:20829,33729:20830,33730:20831,33731:20832,33732:20833,33733:20835,33734:20836,33735:20838,33736:20839,33737:20841,33738:20842,33739:20847,33740:20850,33741:20858,33742:20862,33743:20863,33744:20867,33745:20868,33746:20870,33747:20871,33748:20874,33749:20875,33750:20878,33751:20879,33752:20880,33753:20881,33754:20883,33755:20884,33756:20888,33757:20890,33758:20893,33759:20894,33760:20895,33761:20897,33762:20899,33763:20902,33764:20903,33765:20904,33766:20905,33767:20906,33768:20909,33769:20910,33770:20916,33771:20920,33772:20921,33773:20922,33774:20926,33775:20927,33776:20929,33777:20930,33778:20931,33779:20933,33780:20936,33781:20938,33782:20941,33783:20942,33784:20944,33785:20946,33786:20947,33787:20948,33788:20949,33789:20950,33790:20951,33856:20952,33857:20953,33858:20954,33859:20956,33860:20958,33861:20959,33862:20962,33863:20963,33864:20965,33865:20966,33866:20967,33867:20968,33868:20969,33869:20970,33870:20972,33871:20974,33872:20977,33873:20978,33874:20980,33875:20983,33876:20990,33877:20996,33878:20997,33879:21001,33880:21003,33881:21004,33882:21007,33883:21008,33884:21011,33885:21012,33886:21013,33887:21020,33888:21022,33889:21023,33890:21025,33891:21026,33892:21027,33893:21029,33894:21030,33895:21031,33896:21034,33897:21036,33898:21039,33899:21041,33900:21042,33901:21044,33902:21045,33903:21052,33904:21054,33905:21060,33906:21061,33907:21062,33908:21063,33909:21064,33910:21065,33911:21067,33912:21070,33913:21071,33914:21074,33915:21075,33916:21077,33917:21079,33918:21080,33920:21081,33921:21082,33922:21083,33923:21085,33924:21087,33925:21088,33926:21090,33927:21091,33928:21092,33929:21094,33930:21096,33931:21099,33932:21100,33933:21101,33934:21102,33935:21104,33936:21105,33937:21107,33938:21108,33939:21109,33940:21110,33941:21111,33942:21112,33943:21113,33944:21114,33945:21115,33946:21116,33947:21118,33948:21120,33949:21123,33950:21124,33951:21125,33952:21126,33953:21127,33954:21129,33955:21130,33956:21131,33957:21132,33958:21133,33959:21134,33960:21135,33961:21137,33962:21138,33963:21140,33964:21141,33965:21142,33966:21143,33967:21144,33968:21145,33969:21146,33970:21148,33971:21156,33972:21157,33973:21158,33974:21159,33975:21166,33976:21167,33977:21168,33978:21172,33979:21173,33980:21174,33981:21175,33982:21176,33983:21177,33984:21178,33985:21179,33986:21180,33987:21181,33988:21184,33989:21185,33990:21186,33991:21188,33992:21189,33993:21190,33994:21192,33995:21194,33996:21196,33997:21197,33998:21198,33999:21199,34000:21201,34001:21203,34002:21204,34003:21205,34004:21207,34005:21209,34006:21210,34007:21211,34008:21212,34009:21213,34010:21214,34011:21216,34012:21217,34013:21218,34014:21219,34015:21221,34016:21222,34017:21223,34018:21224,34019:21225,34020:21226,34021:21227,34022:21228,34023:21229,34024:21230,34025:21231,34026:21233,34027:21234,34028:21235,34029:21236,34030:21237,34031:21238,34032:21239,34033:21240,34034:21243,34035:21244,34036:21245,34037:21249,34038:21250,34039:21251,34040:21252,34041:21255,34042:21257,34043:21258,34044:21259,34045:21260,34046:21262,34112:21265,34113:21266,34114:21267,34115:21268,34116:21272,34117:21275,34118:21276,34119:21278,34120:21279,34121:21282,34122:21284,34123:21285,34124:21287,34125:21288,34126:21289,34127:21291,34128:21292,34129:21293,34130:21295,34131:21296,34132:21297,34133:21298,34134:21299,34135:21300,34136:21301,34137:21302,34138:21303,34139:21304,34140:21308,34141:21309,34142:21312,34143:21314,34144:21316,34145:21318,34146:21323,34147:21324,34148:21325,34149:21328,34150:21332,34151:21336,34152:21337,34153:21339,34154:21341,34155:21349,34156:21352,34157:21354,34158:21356,34159:21357,34160:21362,34161:21366,34162:21369,34163:21371,34164:21372,34165:21373,34166:21374,34167:21376,34168:21377,34169:21379,34170:21383,34171:21384,34172:21386,34173:21390,34174:21391,34176:21392,34177:21393,34178:21394,34179:21395,34180:21396,34181:21398,34182:21399,34183:21401,34184:21403,34185:21404,34186:21406,34187:21408,34188:21409,34189:21412,34190:21415,34191:21418,34192:21419,34193:21420,34194:21421,34195:21423,34196:21424,34197:21425,34198:21426,34199:21427,34200:21428,34201:21429,34202:21431,34203:21432,34204:21433,34205:21434,34206:21436,34207:21437,34208:21438,34209:21440,34210:21443,34211:21444,34212:21445,34213:21446,34214:21447,34215:21454,34216:21455,34217:21456,34218:21458,34219:21459,34220:21461,34221:21466,34222:21468,34223:21469,34224:21470,34225:21473,34226:21474,34227:21479,34228:21492,34229:21498,34230:21502,34231:21503,34232:21504,34233:21506,34234:21509,34235:21511,34236:21515,34237:21524,34238:21528,34239:21529,34240:21530,34241:21532,34242:21538,34243:21540,34244:21541,34245:21546,34246:21552,34247:21555,34248:21558,34249:21559,34250:21562,34251:21565,34252:21567,34253:21569,34254:21570,34255:21572,34256:21573,34257:21575,34258:21577,34259:21580,34260:21581,34261:21582,34262:21583,34263:21585,34264:21594,34265:21597,34266:21598,34267:21599,34268:21600,34269:21601,34270:21603,34271:21605,34272:21607,34273:21609,34274:21610,34275:21611,34276:21612,34277:21613,34278:21614,34279:21615,34280:21616,34281:21620,34282:21625,34283:21626,34284:21630,34285:21631,34286:21633,34287:21635,34288:21637,34289:21639,34290:21640,34291:21641,34292:21642,34293:21645,34294:21649,34295:21651,34296:21655,34297:21656,34298:21660,34299:21662,34300:21663,34301:21664,34302:21665,34368:21666,34369:21669,34370:21678,34371:21680,34372:21682,34373:21685,34374:21686,34375:21687,34376:21689,34377:21690,34378:21692,34379:21694,34380:21699,34381:21701,34382:21706,34383:21707,34384:21718,34385:21720,34386:21723,34387:21728,34388:21729,34389:21730,34390:21731,34391:21732,34392:21739,34393:21740,34394:21743,34395:21744,34396:21745,34397:21748,34398:21749,34399:21750,34400:21751,34401:21752,34402:21753,34403:21755,34404:21758,34405:21760,34406:21762,34407:21763,34408:21764,34409:21765,34410:21768,34411:21770,34412:21771,34413:21772,34414:21773,34415:21774,34416:21778,34417:21779,34418:21781,34419:21782,34420:21783,34421:21784,34422:21785,34423:21786,34424:21788,34425:21789,34426:21790,34427:21791,34428:21793,34429:21797,34430:21798,34432:21800,34433:21801,34434:21803,34435:21805,34436:21810,34437:21812,34438:21813,34439:21814,34440:21816,34441:21817,34442:21818,34443:21819,34444:21821,34445:21824,34446:21826,34447:21829,34448:21831,34449:21832,34450:21835,34451:21836,34452:21837,34453:21838,34454:21839,34455:21841,34456:21842,34457:21843,34458:21844,34459:21847,34460:21848,34461:21849,34462:21850,34463:21851,34464:21853,34465:21854,34466:21855,34467:21856,34468:21858,34469:21859,34470:21864,34471:21865,34472:21867,34473:21871,34474:21872,34475:21873,34476:21874,34477:21875,34478:21876,34479:21881,34480:21882,34481:21885,34482:21887,34483:21893,34484:21894,34485:21900,34486:21901,34487:21902,34488:21904,34489:21906,34490:21907,34491:21909,34492:21910,34493:21911,34494:21914,34495:21915,34496:21918,34497:21920,34498:21921,34499:21922,34500:21923,34501:21924,34502:21925,34503:21926,34504:21928,34505:21929,34506:21930,34507:21931,34508:21932,34509:21933,34510:21934,34511:21935,34512:21936,34513:21938,34514:21940,34515:21942,34516:21944,34517:21946,34518:21948,34519:21951,34520:21952,34521:21953,34522:21954,34523:21955,34524:21958,34525:21959,34526:21960,34527:21962,34528:21963,34529:21966,34530:21967,34531:21968,34532:21973,34533:21975,34534:21976,34535:21977,34536:21978,34537:21979,34538:21982,34539:21984,34540:21986,34541:21991,34542:21993,34543:21997,34544:21998,34545:22000,34546:22001,34547:22004,34548:22006,34549:22008,34550:22009,34551:22010,34552:22011,34553:22012,34554:22015,34555:22018,34556:22019,34557:22020,34558:22021,34624:22022,34625:22023,34626:22026,34627:22027,34628:22029,34629:22032,34630:22033,34631:22034,34632:22035,34633:22036,34634:22037,34635:22038,34636:22039,34637:22041,34638:22042,34639:22044,34640:22045,34641:22048,34642:22049,34643:22050,34644:22053,34645:22054,34646:22056,34647:22057,34648:22058,34649:22059,34650:22062,34651:22063,34652:22064,34653:22067,34654:22069,34655:22071,34656:22072,34657:22074,34658:22076,34659:22077,34660:22078,34661:22080,34662:22081,34663:22082,34664:22083,34665:22084,34666:22085,34667:22086,34668:22087,34669:22088,34670:22089,34671:22090,34672:22091,34673:22095,34674:22096,34675:22097,34676:22098,34677:22099,34678:22101,34679:22102,34680:22106,34681:22107,34682:22109,34683:22110,34684:22111,34685:22112,34686:22113,34688:22115,34689:22117,34690:22118,34691:22119,34692:22125,34693:22126,34694:22127,34695:22128,34696:22130,34697:22131,34698:22132,34699:22133,34700:22135,34701:22136,34702:22137,34703:22138,34704:22141,34705:22142,34706:22143,34707:22144,34708:22145,34709:22146,34710:22147,34711:22148,34712:22151,34713:22152,34714:22153,34715:22154,34716:22155,34717:22156,34718:22157,34719:22160,34720:22161,34721:22162,34722:22164,34723:22165,34724:22166,34725:22167,34726:22168,34727:22169,34728:22170,34729:22171,34730:22172,34731:22173,34732:22174,34733:22175,34734:22176,34735:22177,34736:22178,34737:22180,34738:22181,34739:22182,34740:22183,34741:22184,34742:22185,34743:22186,34744:22187,34745:22188,34746:22189,34747:22190,34748:22192,34749:22193,34750:22194,34751:22195,34752:22196,34753:22197,34754:22198,34755:22200,34756:22201,34757:22202,34758:22203,34759:22205,34760:22206,34761:22207,34762:22208,34763:22209,34764:22210,34765:22211,34766:22212,34767:22213,34768:22214,34769:22215,34770:22216,34771:22217,34772:22219,34773:22220,34774:22221,34775:22222,34776:22223,34777:22224,34778:22225,34779:22226,34780:22227,34781:22229,34782:22230,34783:22232,34784:22233,34785:22236,34786:22243,34787:22245,34788:22246,34789:22247,34790:22248,34791:22249,34792:22250,34793:22252,34794:22254,34795:22255,34796:22258,34797:22259,34798:22262,34799:22263,34800:22264,34801:22267,34802:22268,34803:22272,34804:22273,34805:22274,34806:22277,34807:22279,34808:22283,34809:22284,34810:22285,34811:22286,34812:22287,34813:22288,34814:22289,34880:22290,34881:22291,34882:22292,34883:22293,34884:22294,34885:22295,34886:22296,34887:22297,34888:22298,34889:22299,34890:22301,34891:22302,34892:22304,34893:22305,34894:22306,34895:22308,34896:22309,34897:22310,34898:22311,34899:22315,34900:22321,34901:22322,34902:22324,34903:22325,34904:22326,34905:22327,34906:22328,34907:22332,34908:22333,34909:22335,34910:22337,34911:22339,34912:22340,34913:22341,34914:22342,34915:22344,34916:22345,34917:22347,34918:22354,34919:22355,34920:22356,34921:22357,34922:22358,34923:22360,34924:22361,34925:22370,34926:22371,34927:22373,34928:22375,34929:22380,34930:22382,34931:22384,34932:22385,34933:22386,34934:22388,34935:22389,34936:22392,34937:22393,34938:22394,34939:22397,34940:22398,34941:22399,34942:22400,34944:22401,34945:22407,34946:22408,34947:22409,34948:22410,34949:22413,34950:22414,34951:22415,34952:22416,34953:22417,34954:22420,34955:22421,34956:22422,34957:22423,34958:22424,34959:22425,34960:22426,34961:22428,34962:22429,34963:22430,34964:22431,34965:22437,34966:22440,34967:22442,34968:22444,34969:22447,34970:22448,34971:22449,34972:22451,34973:22453,34974:22454,34975:22455,34976:22457,34977:22458,34978:22459,34979:22460,34980:22461,34981:22462,34982:22463,34983:22464,34984:22465,34985:22468,34986:22469,34987:22470,34988:22471,34989:22472,34990:22473,34991:22474,34992:22476,34993:22477,34994:22480,34995:22481,34996:22483,34997:22486,34998:22487,34999:22491,35000:22492,35001:22494,35002:22497,35003:22498,35004:22499,35005:22501,35006:22502,35007:22503,35008:22504,35009:22505,35010:22506,35011:22507,35012:22508,35013:22510,35014:22512,35015:22513,35016:22514,35017:22515,35018:22517,35019:22518,35020:22519,35021:22523,35022:22524,35023:22526,35024:22527,35025:22529,35026:22531,35027:22532,35028:22533,35029:22536,35030:22537,35031:22538,35032:22540,35033:22542,35034:22543,35035:22544,35036:22546,35037:22547,35038:22548,35039:22550,35040:22551,35041:22552,35042:22554,35043:22555,35044:22556,35045:22557,35046:22559,35047:22562,35048:22563,35049:22565,35050:22566,35051:22567,35052:22568,35053:22569,35054:22571,35055:22572,35056:22573,35057:22574,35058:22575,35059:22577,35060:22578,35061:22579,35062:22580,35063:22582,35064:22583,35065:22584,35066:22585,35067:22586,35068:22587,35069:22588,35070:22589,35136:22590,35137:22591,35138:22592,35139:22593,35140:22594,35141:22595,35142:22597,35143:22598,35144:22599,35145:22600,35146:22601,35147:22602,35148:22603,35149:22606,35150:22607,35151:22608,35152:22610,35153:22611,35154:22613,35155:22614,35156:22615,35157:22617,35158:22618,35159:22619,35160:22620,35161:22621,35162:22623,35163:22624,35164:22625,35165:22626,35166:22627,35167:22628,35168:22630,35169:22631,35170:22632,35171:22633,35172:22634,35173:22637,35174:22638,35175:22639,35176:22640,35177:22641,35178:22642,35179:22643,35180:22644,35181:22645,35182:22646,35183:22647,35184:22648,35185:22649,35186:22650,35187:22651,35188:22652,35189:22653,35190:22655,35191:22658,35192:22660,35193:22662,35194:22663,35195:22664,35196:22666,35197:22667,35198:22668,35200:22669,35201:22670,35202:22671,35203:22672,35204:22673,35205:22676,35206:22677,35207:22678,35208:22679,35209:22680,35210:22683,35211:22684,35212:22685,35213:22688,35214:22689,35215:22690,35216:22691,35217:22692,35218:22693,35219:22694,35220:22695,35221:22698,35222:22699,35223:22700,35224:22701,35225:22702,35226:22703,35227:22704,35228:22705,35229:22706,35230:22707,35231:22708,35232:22709,35233:22710,35234:22711,35235:22712,35236:22713,35237:22714,35238:22715,35239:22717,35240:22718,35241:22719,35242:22720,35243:22722,35244:22723,35245:22724,35246:22726,35247:22727,35248:22728,35249:22729,35250:22730,35251:22731,35252:22732,35253:22733,35254:22734,35255:22735,35256:22736,35257:22738,35258:22739,35259:22740,35260:22742,35261:22743,35262:22744,35263:22745,35264:22746,35265:22747,35266:22748,35267:22749,35268:22750,35269:22751,35270:22752,35271:22753,35272:22754,35273:22755,35274:22757,35275:22758,35276:22759,35277:22760,35278:22761,35279:22762,35280:22765,35281:22767,35282:22769,35283:22770,35284:22772,35285:22773,35286:22775,35287:22776,35288:22778,35289:22779,35290:22780,35291:22781,35292:22782,35293:22783,35294:22784,35295:22785,35296:22787,35297:22789,35298:22790,35299:22792,35300:22793,35301:22794,35302:22795,35303:22796,35304:22798,35305:22800,35306:22801,35307:22802,35308:22803,35309:22807,35310:22808,35311:22811,35312:22813,35313:22814,35314:22816,35315:22817,35316:22818,35317:22819,35318:22822,35319:22824,35320:22828,35321:22832,35322:22834,35323:22835,35324:22837,35325:22838,35326:22843,35392:22845,35393:22846,35394:22847,35395:22848,35396:22851,35397:22853,35398:22854,35399:22858,35400:22860,35401:22861,35402:22864,35403:22866,35404:22867,35405:22873,35406:22875,35407:22876,35408:22877,35409:22878,35410:22879,35411:22881,35412:22883,35413:22884,35414:22886,35415:22887,35416:22888,35417:22889,35418:22890,35419:22891,35420:22892,35421:22893,35422:22894,35423:22895,35424:22896,35425:22897,35426:22898,35427:22901,35428:22903,35429:22906,35430:22907,35431:22908,35432:22910,35433:22911,35434:22912,35435:22917,35436:22921,35437:22923,35438:22924,35439:22926,35440:22927,35441:22928,35442:22929,35443:22932,35444:22933,35445:22936,35446:22938,35447:22939,35448:22940,35449:22941,35450:22943,35451:22944,35452:22945,35453:22946,35454:22950,35456:22951,35457:22956,35458:22957,35459:22960,35460:22961,35461:22963,35462:22964,35463:22965,35464:22966,35465:22967,35466:22968,35467:22970,35468:22972,35469:22973,35470:22975,35471:22976,35472:22977,35473:22978,35474:22979,35475:22980,35476:22981,35477:22983,35478:22984,35479:22985,35480:22988,35481:22989,35482:22990,35483:22991,35484:22997,35485:22998,35486:23001,35487:23003,35488:23006,35489:23007,35490:23008,35491:23009,35492:23010,35493:23012,35494:23014,35495:23015,35496:23017,35497:23018,35498:23019,35499:23021,35500:23022,35501:23023,35502:23024,35503:23025,35504:23026,35505:23027,35506:23028,35507:23029,35508:23030,35509:23031,35510:23032,35511:23034,35512:23036,35513:23037,35514:23038,35515:23040,35516:23042,35517:23050,35518:23051,35519:23053,35520:23054,35521:23055,35522:23056,35523:23058,35524:23060,35525:23061,35526:23062,35527:23063,35528:23065,35529:23066,35530:23067,35531:23069,35532:23070,35533:23073,35534:23074,35535:23076,35536:23078,35537:23079,35538:23080,35539:23082,35540:23083,35541:23084,35542:23085,35543:23086,35544:23087,35545:23088,35546:23091,35547:23093,35548:23095,35549:23096,35550:23097,35551:23098,35552:23099,35553:23101,35554:23102,35555:23103,35556:23105,35557:23106,35558:23107,35559:23108,35560:23109,35561:23111,35562:23112,35563:23115,35564:23116,35565:23117,35566:23118,35567:23119,35568:23120,35569:23121,35570:23122,35571:23123,35572:23124,35573:23126,35574:23127,35575:23128,35576:23129,35577:23131,35578:23132,35579:23133,35580:23134,35581:23135,35582:23136,35648:23137,35649:23139,35650:23140,35651:23141,35652:23142,35653:23144,35654:23145,35655:23147,35656:23148,35657:23149,35658:23150,35659:23151,35660:23152,35661:23153,35662:23154,35663:23155,35664:23160,35665:23161,35666:23163,35667:23164,35668:23165,35669:23166,35670:23168,35671:23169,35672:23170,35673:23171,35674:23172,35675:23173,35676:23174,35677:23175,35678:23176,35679:23177,35680:23178,35681:23179,35682:23180,35683:23181,35684:23182,35685:23183,35686:23184,35687:23185,35688:23187,35689:23188,35690:23189,35691:23190,35692:23191,35693:23192,35694:23193,35695:23196,35696:23197,35697:23198,35698:23199,35699:23200,35700:23201,35701:23202,35702:23203,35703:23204,35704:23205,35705:23206,35706:23207,35707:23208,35708:23209,35709:23211,35710:23212,35712:23213,35713:23214,35714:23215,35715:23216,35716:23217,35717:23220,35718:23222,35719:23223,35720:23225,35721:23226,35722:23227,35723:23228,35724:23229,35725:23231,35726:23232,35727:23235,35728:23236,35729:23237,35730:23238,35731:23239,35732:23240,35733:23242,35734:23243,35735:23245,35736:23246,35737:23247,35738:23248,35739:23249,35740:23251,35741:23253,35742:23255,35743:23257,35744:23258,35745:23259,35746:23261,35747:23262,35748:23263,35749:23266,35750:23268,35751:23269,35752:23271,35753:23272,35754:23274,35755:23276,35756:23277,35757:23278,35758:23279,35759:23280,35760:23282,35761:23283,35762:23284,35763:23285,35764:23286,35765:23287,35766:23288,35767:23289,35768:23290,35769:23291,35770:23292,35771:23293,35772:23294,35773:23295,35774:23296,35775:23297,35776:23298,35777:23299,35778:23300,35779:23301,35780:23302,35781:23303,35782:23304,35783:23306,35784:23307,35785:23308,35786:23309,35787:23310,35788:23311,35789:23312,35790:23313,35791:23314,35792:23315,35793:23316,35794:23317,35795:23320,35796:23321,35797:23322,35798:23323,35799:23324,35800:23325,35801:23326,35802:23327,35803:23328,35804:23329,35805:23330,35806:23331,35807:23332,35808:23333,35809:23334,35810:23335,35811:23336,35812:23337,35813:23338,35814:23339,35815:23340,35816:23341,35817:23342,35818:23343,35819:23344,35820:23345,35821:23347,35822:23349,35823:23350,35824:23352,35825:23353,35826:23354,35827:23355,35828:23356,35829:23357,35830:23358,35831:23359,35832:23361,35833:23362,35834:23363,35835:23364,35836:23365,35837:23366,35838:23367,35904:23368,35905:23369,35906:23370,35907:23371,35908:23372,35909:23373,35910:23374,35911:23375,35912:23378,35913:23382,35914:23390,35915:23392,35916:23393,35917:23399,35918:23400,35919:23403,35920:23405,35921:23406,35922:23407,35923:23410,35924:23412,35925:23414,35926:23415,35927:23416,35928:23417,35929:23419,35930:23420,35931:23422,35932:23423,35933:23426,35934:23430,35935:23434,35936:23437,35937:23438,35938:23440,35939:23441,35940:23442,35941:23444,35942:23446,35943:23455,35944:23463,35945:23464,35946:23465,35947:23468,35948:23469,35949:23470,35950:23471,35951:23473,35952:23474,35953:23479,35954:23482,35955:23483,35956:23484,35957:23488,35958:23489,35959:23491,35960:23496,35961:23497,35962:23498,35963:23499,35964:23501,35965:23502,35966:23503,35968:23505,35969:23508,35970:23509,35971:23510,35972:23511,35973:23512,35974:23513,35975:23514,35976:23515,35977:23516,35978:23520,35979:23522,35980:23523,35981:23526,35982:23527,35983:23529,35984:23530,35985:23531,35986:23532,35987:23533,35988:23535,35989:23537,35990:23538,35991:23539,35992:23540,35993:23541,35994:23542,35995:23543,35996:23549,35997:23550,35998:23552,35999:23554,36000:23555,36001:23557,36002:23559,36003:23560,36004:23563,36005:23564,36006:23565,36007:23566,36008:23568,36009:23570,36010:23571,36011:23575,36012:23577,36013:23579,36014:23582,36015:23583,36016:23584,36017:23585,36018:23587,36019:23590,36020:23592,36021:23593,36022:23594,36023:23595,36024:23597,36025:23598,36026:23599,36027:23600,36028:23602,36029:23603,36030:23605,36031:23606,36032:23607,36033:23619,36034:23620,36035:23622,36036:23623,36037:23628,36038:23629,36039:23634,36040:23635,36041:23636,36042:23638,36043:23639,36044:23640,36045:23642,36046:23643,36047:23644,36048:23645,36049:23647,36050:23650,36051:23652,36052:23655,36053:23656,36054:23657,36055:23658,36056:23659,36057:23660,36058:23661,36059:23664,36060:23666,36061:23667,36062:23668,36063:23669,36064:23670,36065:23671,36066:23672,36067:23675,36068:23676,36069:23677,36070:23678,36071:23680,36072:23683,36073:23684,36074:23685,36075:23686,36076:23687,36077:23689,36078:23690,36079:23691,36080:23694,36081:23695,36082:23698,36083:23699,36084:23701,36085:23709,36086:23710,36087:23711,36088:23712,36089:23713,36090:23716,36091:23717,36092:23718,36093:23719,36094:23720,36160:23722,36161:23726,36162:23727,36163:23728,36164:23730,36165:23732,36166:23734,36167:23737,36168:23738,36169:23739,36170:23740,36171:23742,36172:23744,36173:23746,36174:23747,36175:23749,36176:23750,36177:23751,36178:23752,36179:23753,36180:23754,36181:23756,36182:23757,36183:23758,36184:23759,36185:23760,36186:23761,36187:23763,36188:23764,36189:23765,36190:23766,36191:23767,36192:23768,36193:23770,36194:23771,36195:23772,36196:23773,36197:23774,36198:23775,36199:23776,36200:23778,36201:23779,36202:23783,36203:23785,36204:23787,36205:23788,36206:23790,36207:23791,36208:23793,36209:23794,36210:23795,36211:23796,36212:23797,36213:23798,36214:23799,36215:23800,36216:23801,36217:23802,36218:23804,36219:23805,36220:23806,36221:23807,36222:23808,36224:23809,36225:23812,36226:23813,36227:23816,36228:23817,36229:23818,36230:23819,36231:23820,36232:23821,36233:23823,36234:23824,36235:23825,36236:23826,36237:23827,36238:23829,36239:23831,36240:23832,36241:23833,36242:23834,36243:23836,36244:23837,36245:23839,36246:23840,36247:23841,36248:23842,36249:23843,36250:23845,36251:23848,36252:23850,36253:23851,36254:23852,36255:23855,36256:23856,36257:23857,36258:23858,36259:23859,36260:23861,36261:23862,36262:23863,36263:23864,36264:23865,36265:23866,36266:23867,36267:23868,36268:23871,36269:23872,36270:23873,36271:23874,36272:23875,36273:23876,36274:23877,36275:23878,36276:23880,36277:23881,36278:23885,36279:23886,36280:23887,36281:23888,36282:23889,36283:23890,36284:23891,36285:23892,36286:23893,36287:23894,36288:23895,36289:23897,36290:23898,36291:23900,36292:23902,36293:23903,36294:23904,36295:23905,36296:23906,36297:23907,36298:23908,36299:23909,36300:23910,36301:23911,36302:23912,36303:23914,36304:23917,36305:23918,36306:23920,36307:23921,36308:23922,36309:23923,36310:23925,36311:23926,36312:23927,36313:23928,36314:23929,36315:23930,36316:23931,36317:23932,36318:23933,36319:23934,36320:23935,36321:23936,36322:23937,36323:23939,36324:23940,36325:23941,36326:23942,36327:23943,36328:23944,36329:23945,36330:23946,36331:23947,36332:23948,36333:23949,36334:23950,36335:23951,36336:23952,36337:23953,36338:23954,36339:23955,36340:23956,36341:23957,36342:23958,36343:23959,36344:23960,36345:23962,36346:23963,36347:23964,36348:23966,36349:23967,36350:23968,36416:23969,36417:23970,36418:23971,36419:23972,36420:23973,36421:23974,36422:23975,36423:23976,36424:23977,36425:23978,36426:23979,36427:23980,36428:23981,36429:23982,36430:23983,36431:23984,36432:23985,36433:23986,36434:23987,36435:23988,36436:23989,36437:23990,36438:23992,36439:23993,36440:23994,36441:23995,36442:23996,36443:23997,36444:23998,36445:23999,36446:24000,36447:24001,36448:24002,36449:24003,36450:24004,36451:24006,36452:24007,36453:24008,36454:24009,36455:24010,36456:24011,36457:24012,36458:24014,36459:24015,36460:24016,36461:24017,36462:24018,36463:24019,36464:24020,36465:24021,36466:24022,36467:24023,36468:24024,36469:24025,36470:24026,36471:24028,36472:24031,36473:24032,36474:24035,36475:24036,36476:24042,36477:24044,36478:24045,36480:24048,36481:24053,36482:24054,36483:24056,36484:24057,36485:24058,36486:24059,36487:24060,36488:24063,36489:24064,36490:24068,36491:24071,36492:24073,36493:24074,36494:24075,36495:24077,36496:24078,36497:24082,36498:24083,36499:24087,36500:24094,36501:24095,36502:24096,36503:24097,36504:24098,36505:24099,36506:24100,36507:24101,36508:24104,36509:24105,36510:24106,36511:24107,36512:24108,36513:24111,36514:24112,36515:24114,36516:24115,36517:24116,36518:24117,36519:24118,36520:24121,36521:24122,36522:24126,36523:24127,36524:24128,36525:24129,36526:24131,36527:24134,36528:24135,36529:24136,36530:24137,36531:24138,36532:24139,36533:24141,36534:24142,36535:24143,36536:24144,36537:24145,36538:24146,36539:24147,36540:24150,36541:24151,36542:24152,36543:24153,36544:24154,36545:24156,36546:24157,36547:24159,36548:24160,36549:24163,36550:24164,36551:24165,36552:24166,36553:24167,36554:24168,36555:24169,36556:24170,36557:24171,36558:24172,36559:24173,36560:24174,36561:24175,36562:24176,36563:24177,36564:24181,36565:24183,36566:24185,36567:24190,36568:24193,36569:24194,36570:24195,36571:24197,36572:24200,36573:24201,36574:24204,36575:24205,36576:24206,36577:24210,36578:24216,36579:24219,36580:24221,36581:24225,36582:24226,36583:24227,36584:24228,36585:24232,36586:24233,36587:24234,36588:24235,36589:24236,36590:24238,36591:24239,36592:24240,36593:24241,36594:24242,36595:24244,36596:24250,36597:24251,36598:24252,36599:24253,36600:24255,36601:24256,36602:24257,36603:24258,36604:24259,36605:24260,36606:24261,36672:24262,36673:24263,36674:24264,36675:24267,36676:24268,36677:24269,36678:24270,36679:24271,36680:24272,36681:24276,36682:24277,36683:24279,36684:24280,36685:24281,36686:24282,36687:24284,36688:24285,36689:24286,36690:24287,36691:24288,36692:24289,36693:24290,36694:24291,36695:24292,36696:24293,36697:24294,36698:24295,36699:24297,36700:24299,36701:24300,36702:24301,36703:24302,36704:24303,36705:24304,36706:24305,36707:24306,36708:24307,36709:24309,36710:24312,36711:24313,36712:24315,36713:24316,36714:24317,36715:24325,36716:24326,36717:24327,36718:24329,36719:24332,36720:24333,36721:24334,36722:24336,36723:24338,36724:24340,36725:24342,36726:24345,36727:24346,36728:24348,36729:24349,36730:24350,36731:24353,36732:24354,36733:24355,36734:24356,36736:24360,36737:24363,36738:24364,36739:24366,36740:24368,36741:24370,36742:24371,36743:24372,36744:24373,36745:24374,36746:24375,36747:24376,36748:24379,36749:24381,36750:24382,36751:24383,36752:24385,36753:24386,36754:24387,36755:24388,36756:24389,36757:24390,36758:24391,36759:24392,36760:24393,36761:24394,36762:24395,36763:24396,36764:24397,36765:24398,36766:24399,36767:24401,36768:24404,36769:24409,36770:24410,36771:24411,36772:24412,36773:24414,36774:24415,36775:24416,36776:24419,36777:24421,36778:24423,36779:24424,36780:24427,36781:24430,36782:24431,36783:24434,36784:24436,36785:24437,36786:24438,36787:24440,36788:24442,36789:24445,36790:24446,36791:24447,36792:24451,36793:24454,36794:24461,36795:24462,36796:24463,36797:24465,36798:24467,36799:24468,36800:24470,36801:24474,36802:24475,36803:24477,36804:24478,36805:24479,36806:24480,36807:24482,36808:24483,36809:24484,36810:24485,36811:24486,36812:24487,36813:24489,36814:24491,36815:24492,36816:24495,36817:24496,36818:24497,36819:24498,36820:24499,36821:24500,36822:24502,36823:24504,36824:24505,36825:24506,36826:24507,36827:24510,36828:24511,36829:24512,36830:24513,36831:24514,36832:24519,36833:24520,36834:24522,36835:24523,36836:24526,36837:24531,36838:24532,36839:24533,36840:24538,36841:24539,36842:24540,36843:24542,36844:24543,36845:24546,36846:24547,36847:24549,36848:24550,36849:24552,36850:24553,36851:24556,36852:24559,36853:24560,36854:24562,36855:24563,36856:24564,36857:24566,36858:24567,36859:24569,36860:24570,36861:24572,36862:24583,36928:24584,36929:24585,36930:24587,36931:24588,36932:24592,36933:24593,36934:24595,36935:24599,36936:24600,36937:24602,36938:24606,36939:24607,36940:24610,36941:24611,36942:24612,36943:24620,36944:24621,36945:24622,36946:24624,36947:24625,36948:24626,36949:24627,36950:24628,36951:24630,36952:24631,36953:24632,36954:24633,36955:24634,36956:24637,36957:24638,36958:24640,36959:24644,36960:24645,36961:24646,36962:24647,36963:24648,36964:24649,36965:24650,36966:24652,36967:24654,36968:24655,36969:24657,36970:24659,36971:24660,36972:24662,36973:24663,36974:24664,36975:24667,36976:24668,36977:24670,36978:24671,36979:24672,36980:24673,36981:24677,36982:24678,36983:24686,36984:24689,36985:24690,36986:24692,36987:24693,36988:24695,36989:24702,36990:24704,36992:24705,36993:24706,36994:24709,36995:24710,36996:24711,36997:24712,36998:24714,36999:24715,37000:24718,37001:24719,37002:24720,37003:24721,37004:24723,37005:24725,37006:24727,37007:24728,37008:24729,37009:24732,37010:24734,37011:24737,37012:24738,37013:24740,37014:24741,37015:24743,37016:24745,37017:24746,37018:24750,37019:24752,37020:24755,37021:24757,37022:24758,37023:24759,37024:24761,37025:24762,37026:24765,37027:24766,37028:24767,37029:24768,37030:24769,37031:24770,37032:24771,37033:24772,37034:24775,37035:24776,37036:24777,37037:24780,37038:24781,37039:24782,37040:24783,37041:24784,37042:24786,37043:24787,37044:24788,37045:24790,37046:24791,37047:24793,37048:24795,37049:24798,37050:24801,37051:24802,37052:24803,37053:24804,37054:24805,37055:24810,37056:24817,37057:24818,37058:24821,37059:24823,37060:24824,37061:24827,37062:24828,37063:24829,37064:24830,37065:24831,37066:24834,37067:24835,37068:24836,37069:24837,37070:24839,37071:24842,37072:24843,37073:24844,37074:24848,37075:24849,37076:24850,37077:24851,37078:24852,37079:24854,37080:24855,37081:24856,37082:24857,37083:24859,37084:24860,37085:24861,37086:24862,37087:24865,37088:24866,37089:24869,37090:24872,37091:24873,37092:24874,37093:24876,37094:24877,37095:24878,37096:24879,37097:24880,37098:24881,37099:24882,37100:24883,37101:24884,37102:24885,37103:24886,37104:24887,37105:24888,37106:24889,37107:24890,37108:24891,37109:24892,37110:24893,37111:24894,37112:24896,37113:24897,37114:24898,37115:24899,37116:24900,37117:24901,37118:24902,37184:24903,37185:24905,37186:24907,37187:24909,37188:24911,37189:24912,37190:24914,37191:24915,37192:24916,37193:24918,37194:24919,37195:24920,37196:24921,37197:24922,37198:24923,37199:24924,37200:24926,37201:24927,37202:24928,37203:24929,37204:24931,37205:24932,37206:24933,37207:24934,37208:24937,37209:24938,37210:24939,37211:24940,37212:24941,37213:24942,37214:24943,37215:24945,37216:24946,37217:24947,37218:24948,37219:24950,37220:24952,37221:24953,37222:24954,37223:24955,37224:24956,37225:24957,37226:24958,37227:24959,37228:24960,37229:24961,37230:24962,37231:24963,37232:24964,37233:24965,37234:24966,37235:24967,37236:24968,37237:24969,37238:24970,37239:24972,37240:24973,37241:24975,37242:24976,37243:24977,37244:24978,37245:24979,37246:24981,37248:24982,37249:24983,37250:24984,37251:24985,37252:24986,37253:24987,37254:24988,37255:24990,37256:24991,37257:24992,37258:24993,37259:24994,37260:24995,37261:24996,37262:24997,37263:24998,37264:25002,37265:25003,37266:25005,37267:25006,37268:25007,37269:25008,37270:25009,37271:25010,37272:25011,37273:25012,37274:25013,37275:25014,37276:25016,37277:25017,37278:25018,37279:25019,37280:25020,37281:25021,37282:25023,37283:25024,37284:25025,37285:25027,37286:25028,37287:25029,37288:25030,37289:25031,37290:25033,37291:25036,37292:25037,37293:25038,37294:25039,37295:25040,37296:25043,37297:25045,37298:25046,37299:25047,37300:25048,37301:25049,37302:25050,37303:25051,37304:25052,37305:25053,37306:25054,37307:25055,37308:25056,37309:25057,37310:25058,37311:25059,37312:25060,37313:25061,37314:25063,37315:25064,37316:25065,37317:25066,37318:25067,37319:25068,37320:25069,37321:25070,37322:25071,37323:25072,37324:25073,37325:25074,37326:25075,37327:25076,37328:25078,37329:25079,37330:25080,37331:25081,37332:25082,37333:25083,37334:25084,37335:25085,37336:25086,37337:25088,37338:25089,37339:25090,37340:25091,37341:25092,37342:25093,37343:25095,37344:25097,37345:25107,37346:25108,37347:25113,37348:25116,37349:25117,37350:25118,37351:25120,37352:25123,37353:25126,37354:25127,37355:25128,37356:25129,37357:25131,37358:25133,37359:25135,37360:25136,37361:25137,37362:25138,37363:25141,37364:25142,37365:25144,37366:25145,37367:25146,37368:25147,37369:25148,37370:25154,37371:25156,37372:25157,37373:25158,37374:25162,37440:25167,37441:25168,37442:25173,37443:25174,37444:25175,37445:25177,37446:25178,37447:25180,37448:25181,37449:25182,37450:25183,37451:25184,37452:25185,37453:25186,37454:25188,37455:25189,37456:25192,37457:25201,37458:25202,37459:25204,37460:25205,37461:25207,37462:25208,37463:25210,37464:25211,37465:25213,37466:25217,37467:25218,37468:25219,37469:25221,37470:25222,37471:25223,37472:25224,37473:25227,37474:25228,37475:25229,37476:25230,37477:25231,37478:25232,37479:25236,37480:25241,37481:25244,37482:25245,37483:25246,37484:25251,37485:25254,37486:25255,37487:25257,37488:25258,37489:25261,37490:25262,37491:25263,37492:25264,37493:25266,37494:25267,37495:25268,37496:25270,37497:25271,37498:25272,37499:25274,37500:25278,37501:25280,37502:25281,37504:25283,37505:25291,37506:25295,37507:25297,37508:25301,37509:25309,37510:25310,37511:25312,37512:25313,37513:25316,37514:25322,37515:25323,37516:25328,37517:25330,37518:25333,37519:25336,37520:25337,37521:25338,37522:25339,37523:25344,37524:25347,37525:25348,37526:25349,37527:25350,37528:25354,37529:25355,37530:25356,37531:25357,37532:25359,37533:25360,37534:25362,37535:25363,37536:25364,37537:25365,37538:25367,37539:25368,37540:25369,37541:25372,37542:25382,37543:25383,37544:25385,37545:25388,37546:25389,37547:25390,37548:25392,37549:25393,37550:25395,37551:25396,37552:25397,37553:25398,37554:25399,37555:25400,37556:25403,37557:25404,37558:25406,37559:25407,37560:25408,37561:25409,37562:25412,37563:25415,37564:25416,37565:25418,37566:25425,37567:25426,37568:25427,37569:25428,37570:25430,37571:25431,37572:25432,37573:25433,37574:25434,37575:25435,37576:25436,37577:25437,37578:25440,37579:25444,37580:25445,37581:25446,37582:25448,37583:25450,37584:25451,37585:25452,37586:25455,37587:25456,37588:25458,37589:25459,37590:25460,37591:25461,37592:25464,37593:25465,37594:25468,37595:25469,37596:25470,37597:25471,37598:25473,37599:25475,37600:25476,37601:25477,37602:25478,37603:25483,37604:25485,37605:25489,37606:25491,37607:25492,37608:25493,37609:25495,37610:25497,37611:25498,37612:25499,37613:25500,37614:25501,37615:25502,37616:25503,37617:25505,37618:25508,37619:25510,37620:25515,37621:25519,37622:25521,37623:25522,37624:25525,37625:25526,37626:25529,37627:25531,37628:25533,37629:25535,37630:25536,37696:25537,37697:25538,37698:25539,37699:25541,37700:25543,37701:25544,37702:25546,37703:25547,37704:25548,37705:25553,37706:25555,37707:25556,37708:25557,37709:25559,37710:25560,37711:25561,37712:25562,37713:25563,37714:25564,37715:25565,37716:25567,37717:25570,37718:25572,37719:25573,37720:25574,37721:25575,37722:25576,37723:25579,37724:25580,37725:25582,37726:25583,37727:25584,37728:25585,37729:25587,37730:25589,37731:25591,37732:25593,37733:25594,37734:25595,37735:25596,37736:25598,37737:25603,37738:25604,37739:25606,37740:25607,37741:25608,37742:25609,37743:25610,37744:25613,37745:25614,37746:25617,37747:25618,37748:25621,37749:25622,37750:25623,37751:25624,37752:25625,37753:25626,37754:25629,37755:25631,37756:25634,37757:25635,37758:25636,37760:25637,37761:25639,37762:25640,37763:25641,37764:25643,37765:25646,37766:25647,37767:25648,37768:25649,37769:25650,37770:25651,37771:25653,37772:25654,37773:25655,37774:25656,37775:25657,37776:25659,37777:25660,37778:25662,37779:25664,37780:25666,37781:25667,37782:25673,37783:25675,37784:25676,37785:25677,37786:25678,37787:25679,37788:25680,37789:25681,37790:25683,37791:25685,37792:25686,37793:25687,37794:25689,37795:25690,37796:25691,37797:25692,37798:25693,37799:25695,37800:25696,37801:25697,37802:25698,37803:25699,37804:25700,37805:25701,37806:25702,37807:25704,37808:25706,37809:25707,37810:25708,37811:25710,37812:25711,37813:25712,37814:25713,37815:25714,37816:25715,37817:25716,37818:25717,37819:25718,37820:25719,37821:25723,37822:25724,37823:25725,37824:25726,37825:25727,37826:25728,37827:25729,37828:25731,37829:25734,37830:25736,37831:25737,37832:25738,37833:25739,37834:25740,37835:25741,37836:25742,37837:25743,37838:25744,37839:25747,37840:25748,37841:25751,37842:25752,37843:25754,37844:25755,37845:25756,37846:25757,37847:25759,37848:25760,37849:25761,37850:25762,37851:25763,37852:25765,37853:25766,37854:25767,37855:25768,37856:25770,37857:25771,37858:25775,37859:25777,37860:25778,37861:25779,37862:25780,37863:25782,37864:25785,37865:25787,37866:25789,37867:25790,37868:25791,37869:25793,37870:25795,37871:25796,37872:25798,37873:25799,37874:25800,37875:25801,37876:25802,37877:25803,37878:25804,37879:25807,37880:25809,37881:25811,37882:25812,37883:25813,37884:25814,37885:25817,37886:25818,37952:25819,37953:25820,37954:25821,37955:25823,37956:25824,37957:25825,37958:25827,37959:25829,37960:25831,37961:25832,37962:25833,37963:25834,37964:25835,37965:25836,37966:25837,37967:25838,37968:25839,37969:25840,37970:25841,37971:25842,37972:25843,37973:25844,37974:25845,37975:25846,37976:25847,37977:25848,37978:25849,37979:25850,37980:25851,37981:25852,37982:25853,37983:25854,37984:25855,37985:25857,37986:25858,37987:25859,37988:25860,37989:25861,37990:25862,37991:25863,37992:25864,37993:25866,37994:25867,37995:25868,37996:25869,37997:25870,37998:25871,37999:25872,38000:25873,38001:25875,38002:25876,38003:25877,38004:25878,38005:25879,38006:25881,38007:25882,38008:25883,38009:25884,38010:25885,38011:25886,38012:25887,38013:25888,38014:25889,38016:25890,38017:25891,38018:25892,38019:25894,38020:25895,38021:25896,38022:25897,38023:25898,38024:25900,38025:25901,38026:25904,38027:25905,38028:25906,38029:25907,38030:25911,38031:25914,38032:25916,38033:25917,38034:25920,38035:25921,38036:25922,38037:25923,38038:25924,38039:25926,38040:25927,38041:25930,38042:25931,38043:25933,38044:25934,38045:25936,38046:25938,38047:25939,38048:25940,38049:25943,38050:25944,38051:25946,38052:25948,38053:25951,38054:25952,38055:25953,38056:25956,38057:25957,38058:25959,38059:25960,38060:25961,38061:25962,38062:25965,38063:25966,38064:25967,38065:25969,38066:25971,38067:25973,38068:25974,38069:25976,38070:25977,38071:25978,38072:25979,38073:25980,38074:25981,38075:25982,38076:25983,38077:25984,38078:25985,38079:25986,38080:25987,38081:25988,38082:25989,38083:25990,38084:25992,38085:25993,38086:25994,38087:25997,38088:25998,38089:25999,38090:26002,38091:26004,38092:26005,38093:26006,38094:26008,38095:26010,38096:26013,38097:26014,38098:26016,38099:26018,38100:26019,38101:26022,38102:26024,38103:26026,38104:26028,38105:26030,38106:26033,38107:26034,38108:26035,38109:26036,38110:26037,38111:26038,38112:26039,38113:26040,38114:26042,38115:26043,38116:26046,38117:26047,38118:26048,38119:26050,38120:26055,38121:26056,38122:26057,38123:26058,38124:26061,38125:26064,38126:26065,38127:26067,38128:26068,38129:26069,38130:26072,38131:26073,38132:26074,38133:26075,38134:26076,38135:26077,38136:26078,38137:26079,38138:26081,38139:26083,38140:26084,38141:26090,38142:26091,38208:26098,38209:26099,38210:26100,38211:26101,38212:26104,38213:26105,38214:26107,38215:26108,38216:26109,38217:26110,38218:26111,38219:26113,38220:26116,38221:26117,38222:26119,38223:26120,38224:26121,38225:26123,38226:26125,38227:26128,38228:26129,38229:26130,38230:26134,38231:26135,38232:26136,38233:26138,38234:26139,38235:26140,38236:26142,38237:26145,38238:26146,38239:26147,38240:26148,38241:26150,38242:26153,38243:26154,38244:26155,38245:26156,38246:26158,38247:26160,38248:26162,38249:26163,38250:26167,38251:26168,38252:26169,38253:26170,38254:26171,38255:26173,38256:26175,38257:26176,38258:26178,38259:26180,38260:26181,38261:26182,38262:26183,38263:26184,38264:26185,38265:26186,38266:26189,38267:26190,38268:26192,38269:26193,38270:26200,38272:26201,38273:26203,38274:26204,38275:26205,38276:26206,38277:26208,38278:26210,38279:26211,38280:26213,38281:26215,38282:26217,38283:26218,38284:26219,38285:26220,38286:26221,38287:26225,38288:26226,38289:26227,38290:26229,38291:26232,38292:26233,38293:26235,38294:26236,38295:26237,38296:26239,38297:26240,38298:26241,38299:26243,38300:26245,38301:26246,38302:26248,38303:26249,38304:26250,38305:26251,38306:26253,38307:26254,38308:26255,38309:26256,38310:26258,38311:26259,38312:26260,38313:26261,38314:26264,38315:26265,38316:26266,38317:26267,38318:26268,38319:26270,38320:26271,38321:26272,38322:26273,38323:26274,38324:26275,38325:26276,38326:26277,38327:26278,38328:26281,38329:26282,38330:26283,38331:26284,38332:26285,38333:26287,38334:26288,38335:26289,38336:26290,38337:26291,38338:26293,38339:26294,38340:26295,38341:26296,38342:26298,38343:26299,38344:26300,38345:26301,38346:26303,38347:26304,38348:26305,38349:26306,38350:26307,38351:26308,38352:26309,38353:26310,38354:26311,38355:26312,38356:26313,38357:26314,38358:26315,38359:26316,38360:26317,38361:26318,38362:26319,38363:26320,38364:26321,38365:26322,38366:26323,38367:26324,38368:26325,38369:26326,38370:26327,38371:26328,38372:26330,38373:26334,38374:26335,38375:26336,38376:26337,38377:26338,38378:26339,38379:26340,38380:26341,38381:26343,38382:26344,38383:26346,38384:26347,38385:26348,38386:26349,38387:26350,38388:26351,38389:26353,38390:26357,38391:26358,38392:26360,38393:26362,38394:26363,38395:26365,38396:26369,38397:26370,38398:26371,38464:26372,38465:26373,38466:26374,38467:26375,38468:26380,38469:26382,38470:26383,38471:26385,38472:26386,38473:26387,38474:26390,38475:26392,38476:26393,38477:26394,38478:26396,38479:26398,38480:26400,38481:26401,38482:26402,38483:26403,38484:26404,38485:26405,38486:26407,38487:26409,38488:26414,38489:26416,38490:26418,38491:26419,38492:26422,38493:26423,38494:26424,38495:26425,38496:26427,38497:26428,38498:26430,38499:26431,38500:26433,38501:26436,38502:26437,38503:26439,38504:26442,38505:26443,38506:26445,38507:26450,38508:26452,38509:26453,38510:26455,38511:26456,38512:26457,38513:26458,38514:26459,38515:26461,38516:26466,38517:26467,38518:26468,38519:26470,38520:26471,38521:26475,38522:26476,38523:26478,38524:26481,38525:26484,38526:26486,38528:26488,38529:26489,38530:26490,38531:26491,38532:26493,38533:26496,38534:26498,38535:26499,38536:26501,38537:26502,38538:26504,38539:26506,38540:26508,38541:26509,38542:26510,38543:26511,38544:26513,38545:26514,38546:26515,38547:26516,38548:26518,38549:26521,38550:26523,38551:26527,38552:26528,38553:26529,38554:26532,38555:26534,38556:26537,38557:26540,38558:26542,38559:26545,38560:26546,38561:26548,38562:26553,38563:26554,38564:26555,38565:26556,38566:26557,38567:26558,38568:26559,38569:26560,38570:26562,38571:26565,38572:26566,38573:26567,38574:26568,38575:26569,38576:26570,38577:26571,38578:26572,38579:26573,38580:26574,38581:26581,38582:26582,38583:26583,38584:26587,38585:26591,38586:26593,38587:26595,38588:26596,38589:26598,38590:26599,38591:26600,38592:26602,38593:26603,38594:26605,38595:26606,38596:26610,38597:26613,38598:26614,38599:26615,38600:26616,38601:26617,38602:26618,38603:26619,38604:26620,38605:26622,38606:26625,38607:26626,38608:26627,38609:26628,38610:26630,38611:26637,38612:26640,38613:26642,38614:26644,38615:26645,38616:26648,38617:26649,38618:26650,38619:26651,38620:26652,38621:26654,38622:26655,38623:26656,38624:26658,38625:26659,38626:26660,38627:26661,38628:26662,38629:26663,38630:26664,38631:26667,38632:26668,38633:26669,38634:26670,38635:26671,38636:26672,38637:26673,38638:26676,38639:26677,38640:26678,38641:26682,38642:26683,38643:26687,38644:26695,38645:26699,38646:26701,38647:26703,38648:26706,38649:26710,38650:26711,38651:26712,38652:26713,38653:26714,38654:26715,38720:26716,38721:26717,38722:26718,38723:26719,38724:26730,38725:26732,38726:26733,38727:26734,38728:26735,38729:26736,38730:26737,38731:26738,38732:26739,38733:26741,38734:26744,38735:26745,38736:26746,38737:26747,38738:26748,38739:26749,38740:26750,38741:26751,38742:26752,38743:26754,38744:26756,38745:26759,38746:26760,38747:26761,38748:26762,38749:26763,38750:26764,38751:26765,38752:26766,38753:26768,38754:26769,38755:26770,38756:26772,38757:26773,38758:26774,38759:26776,38760:26777,38761:26778,38762:26779,38763:26780,38764:26781,38765:26782,38766:26783,38767:26784,38768:26785,38769:26787,38770:26788,38771:26789,38772:26793,38773:26794,38774:26795,38775:26796,38776:26798,38777:26801,38778:26802,38779:26804,38780:26806,38781:26807,38782:26808,38784:26809,38785:26810,38786:26811,38787:26812,38788:26813,38789:26814,38790:26815,38791:26817,38792:26819,38793:26820,38794:26821,38795:26822,38796:26823,38797:26824,38798:26826,38799:26828,38800:26830,38801:26831,38802:26832,38803:26833,38804:26835,38805:26836,38806:26838,38807:26839,38808:26841,38809:26843,38810:26844,38811:26845,38812:26846,38813:26847,38814:26849,38815:26850,38816:26852,38817:26853,38818:26854,38819:26855,38820:26856,38821:26857,38822:26858,38823:26859,38824:26860,38825:26861,38826:26863,38827:26866,38828:26867,38829:26868,38830:26870,38831:26871,38832:26872,38833:26875,38834:26877,38835:26878,38836:26879,38837:26880,38838:26882,38839:26883,38840:26884,38841:26886,38842:26887,38843:26888,38844:26889,38845:26890,38846:26892,38847:26895,38848:26897,38849:26899,38850:26900,38851:26901,38852:26902,38853:26903,38854:26904,38855:26905,38856:26906,38857:26907,38858:26908,38859:26909,38860:26910,38861:26913,38862:26914,38863:26915,38864:26917,38865:26918,38866:26919,38867:26920,38868:26921,38869:26922,38870:26923,38871:26924,38872:26926,38873:26927,38874:26929,38875:26930,38876:26931,38877:26933,38878:26934,38879:26935,38880:26936,38881:26938,38882:26939,38883:26940,38884:26942,38885:26944,38886:26945,38887:26947,38888:26948,38889:26949,38890:26950,38891:26951,38892:26952,38893:26953,38894:26954,38895:26955,38896:26956,38897:26957,38898:26958,38899:26959,38900:26960,38901:26961,38902:26962,38903:26963,38904:26965,38905:26966,38906:26968,38907:26969,38908:26971,38909:26972,38910:26975,38976:26977,38977:26978,38978:26980,38979:26981,38980:26983,38981:26984,38982:26985,38983:26986,38984:26988,38985:26989,38986:26991,38987:26992,38988:26994,38989:26995,38990:26996,38991:26997,38992:26998,38993:27002,38994:27003,38995:27005,38996:27006,38997:27007,38998:27009,38999:27011,39000:27013,39001:27018,39002:27019,39003:27020,39004:27022,39005:27023,39006:27024,39007:27025,39008:27026,39009:27027,39010:27030,39011:27031,39012:27033,39013:27034,39014:27037,39015:27038,39016:27039,39017:27040,39018:27041,39019:27042,39020:27043,39021:27044,39022:27045,39023:27046,39024:27049,39025:27050,39026:27052,39027:27054,39028:27055,39029:27056,39030:27058,39031:27059,39032:27061,39033:27062,39034:27064,39035:27065,39036:27066,39037:27068,39038:27069,39040:27070,39041:27071,39042:27072,39043:27074,39044:27075,39045:27076,39046:27077,39047:27078,39048:27079,39049:27080,39050:27081,39051:27083,39052:27085,39053:27087,39054:27089,39055:27090,39056:27091,39057:27093,39058:27094,39059:27095,39060:27096,39061:27097,39062:27098,39063:27100,39064:27101,39065:27102,39066:27105,39067:27106,39068:27107,39069:27108,39070:27109,39071:27110,39072:27111,39073:27112,39074:27113,39075:27114,39076:27115,39077:27116,39078:27118,39079:27119,39080:27120,39081:27121,39082:27123,39083:27124,39084:27125,39085:27126,39086:27127,39087:27128,39088:27129,39089:27130,39090:27131,39091:27132,39092:27134,39093:27136,39094:27137,39095:27138,39096:27139,39097:27140,39098:27141,39099:27142,39100:27143,39101:27144,39102:27145,39103:27147,39104:27148,39105:27149,39106:27150,39107:27151,39108:27152,39109:27153,39110:27154,39111:27155,39112:27156,39113:27157,39114:27158,39115:27161,39116:27162,39117:27163,39118:27164,39119:27165,39120:27166,39121:27168,39122:27170,39123:27171,39124:27172,39125:27173,39126:27174,39127:27175,39128:27177,39129:27179,39130:27180,39131:27181,39132:27182,39133:27184,39134:27186,39135:27187,39136:27188,39137:27190,39138:27191,39139:27192,39140:27193,39141:27194,39142:27195,39143:27196,39144:27199,39145:27200,39146:27201,39147:27202,39148:27203,39149:27205,39150:27206,39151:27208,39152:27209,39153:27210,39154:27211,39155:27212,39156:27213,39157:27214,39158:27215,39159:27217,39160:27218,39161:27219,39162:27220,39163:27221,39164:27222,39165:27223,39166:27226,39232:27228,39233:27229,39234:27230,39235:27231,39236:27232,39237:27234,39238:27235,39239:27236,39240:27238,39241:27239,39242:27240,39243:27241,39244:27242,39245:27243,39246:27244,39247:27245,39248:27246,39249:27247,39250:27248,39251:27250,39252:27251,39253:27252,39254:27253,39255:27254,39256:27255,39257:27256,39258:27258,39259:27259,39260:27261,39261:27262,39262:27263,39263:27265,39264:27266,39265:27267,39266:27269,39267:27270,39268:27271,39269:27272,39270:27273,39271:27274,39272:27275,39273:27276,39274:27277,39275:27279,39276:27282,39277:27283,39278:27284,39279:27285,39280:27286,39281:27288,39282:27289,39283:27290,39284:27291,39285:27292,39286:27293,39287:27294,39288:27295,39289:27297,39290:27298,39291:27299,39292:27300,39293:27301,39294:27302,39296:27303,39297:27304,39298:27306,39299:27309,39300:27310,39301:27311,39302:27312,39303:27313,39304:27314,39305:27315,39306:27316,39307:27317,39308:27318,39309:27319,39310:27320,39311:27321,39312:27322,39313:27323,39314:27324,39315:27325,39316:27326,39317:27327,39318:27328,39319:27329,39320:27330,39321:27331,39322:27332,39323:27333,39324:27334,39325:27335,39326:27336,39327:27337,39328:27338,39329:27339,39330:27340,39331:27341,39332:27342,39333:27343,39334:27344,39335:27345,39336:27346,39337:27347,39338:27348,39339:27349,39340:27350,39341:27351,39342:27352,39343:27353,39344:27354,39345:27355,39346:27356,39347:27357,39348:27358,39349:27359,39350:27360,39351:27361,39352:27362,39353:27363,39354:27364,39355:27365,39356:27366,39357:27367,39358:27368,39359:27369,39360:27370,39361:27371,39362:27372,39363:27373,39364:27374,39365:27375,39366:27376,39367:27377,39368:27378,39369:27379,39370:27380,39371:27381,39372:27382,39373:27383,39374:27384,39375:27385,39376:27386,39377:27387,39378:27388,39379:27389,39380:27390,39381:27391,39382:27392,39383:27393,39384:27394,39385:27395,39386:27396,39387:27397,39388:27398,39389:27399,39390:27400,39391:27401,39392:27402,39393:27403,39394:27404,39395:27405,39396:27406,39397:27407,39398:27408,39399:27409,39400:27410,39401:27411,39402:27412,39403:27413,39404:27414,39405:27415,39406:27416,39407:27417,39408:27418,39409:27419,39410:27420,39411:27421,39412:27422,39413:27423,39414:27429,39415:27430,39416:27432,39417:27433,39418:27434,39419:27435,39420:27436,39421:27437,39422:27438,39488:27439,39489:27440,39490:27441,39491:27443,39492:27444,39493:27445,39494:27446,39495:27448,39496:27451,39497:27452,39498:27453,39499:27455,39500:27456,39501:27457,39502:27458,39503:27460,39504:27461,39505:27464,39506:27466,39507:27467,39508:27469,39509:27470,39510:27471,39511:27472,39512:27473,39513:27474,39514:27475,39515:27476,39516:27477,39517:27478,39518:27479,39519:27480,39520:27482,39521:27483,39522:27484,39523:27485,39524:27486,39525:27487,39526:27488,39527:27489,39528:27496,39529:27497,39530:27499,39531:27500,39532:27501,39533:27502,39534:27503,39535:27504,39536:27505,39537:27506,39538:27507,39539:27508,39540:27509,39541:27510,39542:27511,39543:27512,39544:27514,39545:27517,39546:27518,39547:27519,39548:27520,39549:27525,39550:27528,39552:27532,39553:27534,39554:27535,39555:27536,39556:27537,39557:27540,39558:27541,39559:27543,39560:27544,39561:27545,39562:27548,39563:27549,39564:27550,39565:27551,39566:27552,39567:27554,39568:27555,39569:27556,39570:27557,39571:27558,39572:27559,39573:27560,39574:27561,39575:27563,39576:27564,39577:27565,39578:27566,39579:27567,39580:27568,39581:27569,39582:27570,39583:27574,39584:27576,39585:27577,39586:27578,39587:27579,39588:27580,39589:27581,39590:27582,39591:27584,39592:27587,39593:27588,39594:27590,39595:27591,39596:27592,39597:27593,39598:27594,39599:27596,39600:27598,39601:27600,39602:27601,39603:27608,39604:27610,39605:27612,39606:27613,39607:27614,39608:27615,39609:27616,39610:27618,39611:27619,39612:27620,39613:27621,39614:27622,39615:27623,39616:27624,39617:27625,39618:27628,39619:27629,39620:27630,39621:27632,39622:27633,39623:27634,39624:27636,39625:27638,39626:27639,39627:27640,39628:27642,39629:27643,39630:27644,39631:27646,39632:27647,39633:27648,39634:27649,39635:27650,39636:27651,39637:27652,39638:27656,39639:27657,39640:27658,39641:27659,39642:27660,39643:27662,39644:27666,39645:27671,39646:27676,39647:27677,39648:27678,39649:27680,39650:27683,39651:27685,39652:27691,39653:27692,39654:27693,39655:27697,39656:27699,39657:27702,39658:27703,39659:27705,39660:27706,39661:27707,39662:27708,39663:27710,39664:27711,39665:27715,39666:27716,39667:27717,39668:27720,39669:27723,39670:27724,39671:27725,39672:27726,39673:27727,39674:27729,39675:27730,39676:27731,39677:27734,39678:27736,39744:27737,39745:27738,39746:27746,39747:27747,39748:27749,39749:27750,39750:27751,39751:27755,39752:27756,39753:27757,39754:27758,39755:27759,39756:27761,39757:27763,39758:27765,39759:27767,39760:27768,39761:27770,39762:27771,39763:27772,39764:27775,39765:27776,39766:27780,39767:27783,39768:27786,39769:27787,39770:27789,39771:27790,39772:27793,39773:27794,39774:27797,39775:27798,39776:27799,39777:27800,39778:27802,39779:27804,39780:27805,39781:27806,39782:27808,39783:27810,39784:27816,39785:27820,39786:27823,39787:27824,39788:27828,39789:27829,39790:27830,39791:27831,39792:27834,39793:27840,39794:27841,39795:27842,39796:27843,39797:27846,39798:27847,39799:27848,39800:27851,39801:27853,39802:27854,39803:27855,39804:27857,39805:27858,39806:27864,39808:27865,39809:27866,39810:27868,39811:27869,39812:27871,39813:27876,39814:27878,39815:27879,39816:27881,39817:27884,39818:27885,39819:27890,39820:27892,39821:27897,39822:27903,39823:27904,39824:27906,39825:27907,39826:27909,39827:27910,39828:27912,39829:27913,39830:27914,39831:27917,39832:27919,39833:27920,39834:27921,39835:27923,39836:27924,39837:27925,39838:27926,39839:27928,39840:27932,39841:27933,39842:27935,39843:27936,39844:27937,39845:27938,39846:27939,39847:27940,39848:27942,39849:27944,39850:27945,39851:27948,39852:27949,39853:27951,39854:27952,39855:27956,39856:27958,39857:27959,39858:27960,39859:27962,39860:27967,39861:27968,39862:27970,39863:27972,39864:27977,39865:27980,39866:27984,39867:27989,39868:27990,39869:27991,39870:27992,39871:27995,39872:27997,39873:27999,39874:28001,39875:28002,39876:28004,39877:28005,39878:28007,39879:28008,39880:28011,39881:28012,39882:28013,39883:28016,39884:28017,39885:28018,39886:28019,39887:28021,39888:28022,39889:28025,39890:28026,39891:28027,39892:28029,39893:28030,39894:28031,39895:28032,39896:28033,39897:28035,39898:28036,39899:28038,39900:28039,39901:28042,39902:28043,39903:28045,39904:28047,39905:28048,39906:28050,39907:28054,39908:28055,39909:28056,39910:28057,39911:28058,39912:28060,39913:28066,39914:28069,39915:28076,39916:28077,39917:28080,39918:28081,39919:28083,39920:28084,39921:28086,39922:28087,39923:28089,39924:28090,39925:28091,39926:28092,39927:28093,39928:28094,39929:28097,39930:28098,39931:28099,39932:28104,39933:28105,39934:28106,40000:28109,40001:28110,40002:28111,40003:28112,40004:28114,40005:28115,40006:28116,40007:28117,40008:28119,40009:28122,40010:28123,40011:28124,40012:28127,40013:28130,40014:28131,40015:28133,40016:28135,40017:28136,40018:28137,40019:28138,40020:28141,40021:28143,40022:28144,40023:28146,40024:28148,40025:28149,40026:28150,40027:28152,40028:28154,40029:28157,40030:28158,40031:28159,40032:28160,40033:28161,40034:28162,40035:28163,40036:28164,40037:28166,40038:28167,40039:28168,40040:28169,40041:28171,40042:28175,40043:28178,40044:28179,40045:28181,40046:28184,40047:28185,40048:28187,40049:28188,40050:28190,40051:28191,40052:28194,40053:28198,40054:28199,40055:28200,40056:28202,40057:28204,40058:28206,40059:28208,40060:28209,40061:28211,40062:28213,40064:28214,40065:28215,40066:28217,40067:28219,40068:28220,40069:28221,40070:28222,40071:28223,40072:28224,40073:28225,40074:28226,40075:28229,40076:28230,40077:28231,40078:28232,40079:28233,40080:28234,40081:28235,40082:28236,40083:28239,40084:28240,40085:28241,40086:28242,40087:28245,40088:28247,40089:28249,40090:28250,40091:28252,40092:28253,40093:28254,40094:28256,40095:28257,40096:28258,40097:28259,40098:28260,40099:28261,40100:28262,40101:28263,40102:28264,40103:28265,40104:28266,40105:28268,40106:28269,40107:28271,40108:28272,40109:28273,40110:28274,40111:28275,40112:28276,40113:28277,40114:28278,40115:28279,40116:28280,40117:28281,40118:28282,40119:28283,40120:28284,40121:28285,40122:28288,40123:28289,40124:28290,40125:28292,40126:28295,40127:28296,40128:28298,40129:28299,40130:28300,40131:28301,40132:28302,40133:28305,40134:28306,40135:28307,40136:28308,40137:28309,40138:28310,40139:28311,40140:28313,40141:28314,40142:28315,40143:28317,40144:28318,40145:28320,40146:28321,40147:28323,40148:28324,40149:28326,40150:28328,40151:28329,40152:28331,40153:28332,40154:28333,40155:28334,40156:28336,40157:28339,40158:28341,40159:28344,40160:28345,40161:28348,40162:28350,40163:28351,40164:28352,40165:28355,40166:28356,40167:28357,40168:28358,40169:28360,40170:28361,40171:28362,40172:28364,40173:28365,40174:28366,40175:28368,40176:28370,40177:28374,40178:28376,40179:28377,40180:28379,40181:28380,40182:28381,40183:28387,40184:28391,40185:28394,40186:28395,40187:28396,40188:28397,40189:28398,40190:28399,40256:28400,40257:28401,40258:28402,40259:28403,40260:28405,40261:28406,40262:28407,40263:28408,40264:28410,40265:28411,40266:28412,40267:28413,40268:28414,40269:28415,40270:28416,40271:28417,40272:28419,40273:28420,40274:28421,40275:28423,40276:28424,40277:28426,40278:28427,40279:28428,40280:28429,40281:28430,40282:28432,40283:28433,40284:28434,40285:28438,40286:28439,40287:28440,40288:28441,40289:28442,40290:28443,40291:28444,40292:28445,40293:28446,40294:28447,40295:28449,40296:28450,40297:28451,40298:28453,40299:28454,40300:28455,40301:28456,40302:28460,40303:28462,40304:28464,40305:28466,40306:28468,40307:28469,40308:28471,40309:28472,40310:28473,40311:28474,40312:28475,40313:28476,40314:28477,40315:28479,40316:28480,40317:28481,40318:28482,40320:28483,40321:28484,40322:28485,40323:28488,40324:28489,40325:28490,40326:28492,40327:28494,40328:28495,40329:28496,40330:28497,40331:28498,40332:28499,40333:28500,40334:28501,40335:28502,40336:28503,40337:28505,40338:28506,40339:28507,40340:28509,40341:28511,40342:28512,40343:28513,40344:28515,40345:28516,40346:28517,40347:28519,40348:28520,40349:28521,40350:28522,40351:28523,40352:28524,40353:28527,40354:28528,40355:28529,40356:28531,40357:28533,40358:28534,40359:28535,40360:28537,40361:28539,40362:28541,40363:28542,40364:28543,40365:28544,40366:28545,40367:28546,40368:28547,40369:28549,40370:28550,40371:28551,40372:28554,40373:28555,40374:28559,40375:28560,40376:28561,40377:28562,40378:28563,40379:28564,40380:28565,40381:28566,40382:28567,40383:28568,40384:28569,40385:28570,40386:28571,40387:28573,40388:28574,40389:28575,40390:28576,40391:28578,40392:28579,40393:28580,40394:28581,40395:28582,40396:28584,40397:28585,40398:28586,40399:28587,40400:28588,40401:28589,40402:28590,40403:28591,40404:28592,40405:28593,40406:28594,40407:28596,40408:28597,40409:28599,40410:28600,40411:28602,40412:28603,40413:28604,40414:28605,40415:28606,40416:28607,40417:28609,40418:28611,40419:28612,40420:28613,40421:28614,40422:28615,40423:28616,40424:28618,40425:28619,40426:28620,40427:28621,40428:28622,40429:28623,40430:28624,40431:28627,40432:28628,40433:28629,40434:28630,40435:28631,40436:28632,40437:28633,40438:28634,40439:28635,40440:28636,40441:28637,40442:28639,40443:28642,40444:28643,40445:28644,40446:28645,40512:28646,40513:28647,40514:28648,40515:28649,40516:28650,40517:28651,40518:28652,40519:28653,40520:28656,40521:28657,40522:28658,40523:28659,40524:28660,40525:28661,40526:28662,40527:28663,40528:28664,40529:28665,40530:28666,40531:28667,40532:28668,40533:28669,40534:28670,40535:28671,40536:28672,40537:28673,40538:28674,40539:28675,40540:28676,40541:28677,40542:28678,40543:28679,40544:28680,40545:28681,40546:28682,40547:28683,40548:28684,40549:28685,40550:28686,40551:28687,40552:28688,40553:28690,40554:28691,40555:28692,40556:28693,40557:28694,40558:28695,40559:28696,40560:28697,40561:28700,40562:28701,40563:28702,40564:28703,40565:28704,40566:28705,40567:28706,40568:28708,40569:28709,40570:28710,40571:28711,40572:28712,40573:28713,40574:28714,40576:28715,40577:28716,40578:28717,40579:28718,40580:28719,40581:28720,40582:28721,40583:28722,40584:28723,40585:28724,40586:28726,40587:28727,40588:28728,40589:28730,40590:28731,40591:28732,40592:28733,40593:28734,40594:28735,40595:28736,40596:28737,40597:28738,40598:28739,40599:28740,40600:28741,40601:28742,40602:28743,40603:28744,40604:28745,40605:28746,40606:28747,40607:28749,40608:28750,40609:28752,40610:28753,40611:28754,40612:28755,40613:28756,40614:28757,40615:28758,40616:28759,40617:28760,40618:28761,40619:28762,40620:28763,40621:28764,40622:28765,40623:28767,40624:28768,40625:28769,40626:28770,40627:28771,40628:28772,40629:28773,40630:28774,40631:28775,40632:28776,40633:28777,40634:28778,40635:28782,40636:28785,40637:28786,40638:28787,40639:28788,40640:28791,40641:28793,40642:28794,40643:28795,40644:28797,40645:28801,40646:28802,40647:28803,40648:28804,40649:28806,40650:28807,40651:28808,40652:28811,40653:28812,40654:28813,40655:28815,40656:28816,40657:28817,40658:28819,40659:28823,40660:28824,40661:28826,40662:28827,40663:28830,40664:28831,40665:28832,40666:28833,40667:28834,40668:28835,40669:28836,40670:28837,40671:28838,40672:28839,40673:28840,40674:28841,40675:28842,40676:28848,40677:28850,40678:28852,40679:28853,40680:28854,40681:28858,40682:28862,40683:28863,40684:28868,40685:28869,40686:28870,40687:28871,40688:28873,40689:28875,40690:28876,40691:28877,40692:28878,40693:28879,40694:28880,40695:28881,40696:28882,40697:28883,40698:28884,40699:28885,40700:28886,40701:28887,40702:28890,40768:28892,40769:28893,40770:28894,40771:28896,40772:28897,40773:28898,40774:28899,40775:28901,40776:28906,40777:28910,40778:28912,40779:28913,40780:28914,40781:28915,40782:28916,40783:28917,40784:28918,40785:28920,40786:28922,40787:28923,40788:28924,40789:28926,40790:28927,40791:28928,40792:28929,40793:28930,40794:28931,40795:28932,40796:28933,40797:28934,40798:28935,40799:28936,40800:28939,40801:28940,40802:28941,40803:28942,40804:28943,40805:28945,40806:28946,40807:28948,40808:28951,40809:28955,40810:28956,40811:28957,40812:28958,40813:28959,40814:28960,40815:28961,40816:28962,40817:28963,40818:28964,40819:28965,40820:28967,40821:28968,40822:28969,40823:28970,40824:28971,40825:28972,40826:28973,40827:28974,40828:28978,40829:28979,40830:28980,40832:28981,40833:28983,40834:28984,40835:28985,40836:28986,40837:28987,40838:28988,40839:28989,40840:28990,40841:28991,40842:28992,40843:28993,40844:28994,40845:28995,40846:28996,40847:28998,40848:28999,40849:29000,40850:29001,40851:29003,40852:29005,40853:29007,40854:29008,40855:29009,40856:29010,40857:29011,40858:29012,40859:29013,40860:29014,40861:29015,40862:29016,40863:29017,40864:29018,40865:29019,40866:29021,40867:29023,40868:29024,40869:29025,40870:29026,40871:29027,40872:29029,40873:29033,40874:29034,40875:29035,40876:29036,40877:29037,40878:29039,40879:29040,40880:29041,40881:29044,40882:29045,40883:29046,40884:29047,40885:29049,40886:29051,40887:29052,40888:29054,40889:29055,40890:29056,40891:29057,40892:29058,40893:29059,40894:29061,40895:29062,40896:29063,40897:29064,40898:29065,40899:29067,40900:29068,40901:29069,40902:29070,40903:29072,40904:29073,40905:29074,40906:29075,40907:29077,40908:29078,40909:29079,40910:29082,40911:29083,40912:29084,40913:29085,40914:29086,40915:29089,40916:29090,40917:29091,40918:29092,40919:29093,40920:29094,40921:29095,40922:29097,40923:29098,40924:29099,40925:29101,40926:29102,40927:29103,40928:29104,40929:29105,40930:29106,40931:29108,40932:29110,40933:29111,40934:29112,40935:29114,40936:29115,40937:29116,40938:29117,40939:29118,40940:29119,40941:29120,40942:29121,40943:29122,40944:29124,40945:29125,40946:29126,40947:29127,40948:29128,40949:29129,40950:29130,40951:29131,40952:29132,40953:29133,40954:29135,40955:29136,40956:29137,40957:29138,40958:29139,41024:29142,41025:29143,41026:29144,41027:29145,41028:29146,41029:29147,41030:29148,41031:29149,41032:29150,41033:29151,41034:29153,41035:29154,41036:29155,41037:29156,41038:29158,41039:29160,41040:29161,41041:29162,41042:29163,41043:29164,41044:29165,41045:29167,41046:29168,41047:29169,41048:29170,41049:29171,41050:29172,41051:29173,41052:29174,41053:29175,41054:29176,41055:29178,41056:29179,41057:29180,41058:29181,41059:29182,41060:29183,41061:29184,41062:29185,41063:29186,41064:29187,41065:29188,41066:29189,41067:29191,41068:29192,41069:29193,41070:29194,41071:29195,41072:29196,41073:29197,41074:29198,41075:29199,41076:29200,41077:29201,41078:29202,41079:29203,41080:29204,41081:29205,41082:29206,41083:29207,41084:29208,41085:29209,41086:29210,41088:29211,41089:29212,41090:29214,41091:29215,41092:29216,41093:29217,41094:29218,41095:29219,41096:29220,41097:29221,41098:29222,41099:29223,41100:29225,41101:29227,41102:29229,41103:29230,41104:29231,41105:29234,41106:29235,41107:29236,41108:29242,41109:29244,41110:29246,41111:29248,41112:29249,41113:29250,41114:29251,41115:29252,41116:29253,41117:29254,41118:29257,41119:29258,41120:29259,41121:29262,41122:29263,41123:29264,41124:29265,41125:29267,41126:29268,41127:29269,41128:29271,41129:29272,41130:29274,41131:29276,41132:29278,41133:29280,41134:29283,41135:29284,41136:29285,41137:29288,41138:29290,41139:29291,41140:29292,41141:29293,41142:29296,41143:29297,41144:29299,41145:29300,41146:29302,41147:29303,41148:29304,41149:29307,41150:29308,41151:29309,41152:29314,41153:29315,41154:29317,41155:29318,41156:29319,41157:29320,41158:29321,41159:29324,41160:29326,41161:29328,41162:29329,41163:29331,41164:29332,41165:29333,41166:29334,41167:29335,41168:29336,41169:29337,41170:29338,41171:29339,41172:29340,41173:29341,41174:29342,41175:29344,41176:29345,41177:29346,41178:29347,41179:29348,41180:29349,41181:29350,41182:29351,41183:29352,41184:29353,41185:29354,41186:29355,41187:29358,41188:29361,41189:29362,41190:29363,41191:29365,41192:29370,41193:29371,41194:29372,41195:29373,41196:29374,41197:29375,41198:29376,41199:29381,41200:29382,41201:29383,41202:29385,41203:29386,41204:29387,41205:29388,41206:29391,41207:29393,41208:29395,41209:29396,41210:29397,41211:29398,41212:29400,41213:29402,41214:29403,41280:58566,41281:58567,41282:58568,41283:58569,41284:58570,41285:58571,41286:58572,41287:58573,41288:58574,41289:58575,41290:58576,41291:58577,41292:58578,41293:58579,41294:58580,41295:58581,41296:58582,41297:58583,41298:58584,41299:58585,41300:58586,41301:58587,41302:58588,41303:58589,41304:58590,41305:58591,41306:58592,41307:58593,41308:58594,41309:58595,41310:58596,41311:58597,41312:58598,41313:58599,41314:58600,41315:58601,41316:58602,41317:58603,41318:58604,41319:58605,41320:58606,41321:58607,41322:58608,41323:58609,41324:58610,41325:58611,41326:58612,41327:58613,41328:58614,41329:58615,41330:58616,41331:58617,41332:58618,41333:58619,41334:58620,41335:58621,41336:58622,41337:58623,41338:58624,41339:58625,41340:58626,41341:58627,41342:58628,41344:58629,41345:58630,41346:58631,41347:58632,41348:58633,41349:58634,41350:58635,41351:58636,41352:58637,41353:58638,41354:58639,41355:58640,41356:58641,41357:58642,41358:58643,41359:58644,41360:58645,41361:58646,41362:58647,41363:58648,41364:58649,41365:58650,41366:58651,41367:58652,41368:58653,41369:58654,41370:58655,41371:58656,41372:58657,41373:58658,41374:58659,41375:58660,41376:58661,41377:12288,41378:12289,41379:12290,41380:183,41381:713,41382:711,41383:168,41384:12291,41385:12293,41386:8212,41387:65374,41388:8214,41389:8230,41390:8216,41391:8217,41392:8220,41393:8221,41394:12308,41395:12309,41396:12296,41397:12297,41398:12298,41399:12299,41400:12300,41401:12301,41402:12302,41403:12303,41404:12310,41405:12311,41406:12304,41407:12305,41408:177,41409:215,41410:247,41411:8758,41412:8743,41413:8744,41414:8721,41415:8719,41416:8746,41417:8745,41418:8712,41419:8759,41420:8730,41421:8869,41422:8741,41423:8736,41424:8978,41425:8857,41426:8747,41427:8750,41428:8801,41429:8780,41430:8776,41431:8765,41432:8733,41433:8800,41434:8814,41435:8815,41436:8804,41437:8805,41438:8734,41439:8757,41440:8756,41441:9794,41442:9792,41443:176,41444:8242,41445:8243,41446:8451,41447:65284,41448:164,41449:65504,41450:65505,41451:8240,41452:167,41453:8470,41454:9734,41455:9733,41456:9675,41457:9679,41458:9678,41459:9671,41460:9670,41461:9633,41462:9632,41463:9651,41464:9650,41465:8251,41466:8594,41467:8592,41468:8593,41469:8595,41470:12307,41536:58662,41537:58663,41538:58664,41539:58665,41540:58666,41541:58667,41542:58668,41543:58669,41544:58670,41545:58671,41546:58672,41547:58673,41548:58674,41549:58675,41550:58676,41551:58677,41552:58678,41553:58679,41554:58680,41555:58681,41556:58682,41557:58683,41558:58684,41559:58685,41560:58686,41561:58687,41562:58688,41563:58689,41564:58690,41565:58691,41566:58692,41567:58693,41568:58694,41569:58695,41570:58696,41571:58697,41572:58698,41573:58699,41574:58700,41575:58701,41576:58702,41577:58703,41578:58704,41579:58705,41580:58706,41581:58707,41582:58708,41583:58709,41584:58710,41585:58711,41586:58712,41587:58713,41588:58714,41589:58715,41590:58716,41591:58717,41592:58718,41593:58719,41594:58720,41595:58721,41596:58722,41597:58723,41598:58724,41600:58725,41601:58726,41602:58727,41603:58728,41604:58729,41605:58730,41606:58731,41607:58732,41608:58733,41609:58734,41610:58735,41611:58736,41612:58737,41613:58738,41614:58739,41615:58740,41616:58741,41617:58742,41618:58743,41619:58744,41620:58745,41621:58746,41622:58747,41623:58748,41624:58749,41625:58750,41626:58751,41627:58752,41628:58753,41629:58754,41630:58755,41631:58756,41632:58757,41633:8560,41634:8561,41635:8562,41636:8563,41637:8564,41638:8565,41639:8566,41640:8567,41641:8568,41642:8569,41643:59238,41644:59239,41645:59240,41646:59241,41647:59242,41648:59243,41649:9352,41650:9353,41651:9354,41652:9355,41653:9356,41654:9357,41655:9358,41656:9359,41657:9360,41658:9361,41659:9362,41660:9363,41661:9364,41662:9365,41663:9366,41664:9367,41665:9368,41666:9369,41667:9370,41668:9371,41669:9332,41670:9333,41671:9334,41672:9335,41673:9336,41674:9337,41675:9338,41676:9339,41677:9340,41678:9341,41679:9342,41680:9343,41681:9344,41682:9345,41683:9346,41684:9347,41685:9348,41686:9349,41687:9350,41688:9351,41689:9312,41690:9313,41691:9314,41692:9315,41693:9316,41694:9317,41695:9318,41696:9319,41697:9320,41698:9321,41699:8364,41700:59245,41701:12832,41702:12833,41703:12834,41704:12835,41705:12836,41706:12837,41707:12838,41708:12839,41709:12840,41710:12841,41711:59246,41712:59247,41713:8544,41714:8545,41715:8546,41716:8547,41717:8548,41718:8549,41719:8550,41720:8551,41721:8552,41722:8553,41723:8554,41724:8555,41725:59248,41726:59249,41792:58758,41793:58759,41794:58760,41795:58761,41796:58762,41797:58763,41798:58764,41799:58765,41800:58766,41801:58767,41802:58768,41803:58769,41804:58770,41805:58771,41806:58772,41807:58773,41808:58774,41809:58775,41810:58776,41811:58777,41812:58778,41813:58779,41814:58780,41815:58781,41816:58782,41817:58783,41818:58784,41819:58785,41820:58786,41821:58787,41822:58788,41823:58789,41824:58790,41825:58791,41826:58792,41827:58793,41828:58794,41829:58795,41830:58796,41831:58797,41832:58798,41833:58799,41834:58800,41835:58801,41836:58802,41837:58803,41838:58804,41839:58805,41840:58806,41841:58807,41842:58808,41843:58809,41844:58810,41845:58811,41846:58812,41847:58813,41848:58814,41849:58815,41850:58816,41851:58817,41852:58818,41853:58819,41854:58820,41856:58821,41857:58822,41858:58823,41859:58824,41860:58825,41861:58826,41862:58827,41863:58828,41864:58829,41865:58830,41866:58831,41867:58832,41868:58833,41869:58834,41870:58835,41871:58836,41872:58837,41873:58838,41874:58839,41875:58840,41876:58841,41877:58842,41878:58843,41879:58844,41880:58845,41881:58846,41882:58847,41883:58848,41884:58849,41885:58850,41886:58851,41887:58852,41888:58853,41889:65281,41890:65282,41891:65283,41892:65509,41893:65285,41894:65286,41895:65287,41896:65288,41897:65289,41898:65290,41899:65291,41900:65292,41901:65293,41902:65294,41903:65295,41904:65296,41905:65297,41906:65298,41907:65299,41908:65300,41909:65301,41910:65302,41911:65303,41912:65304,41913:65305,41914:65306,41915:65307,41916:65308,41917:65309,41918:65310,41919:65311,41920:65312,41921:65313,41922:65314,41923:65315,41924:65316,41925:65317,41926:65318,41927:65319,41928:65320,41929:65321,41930:65322,41931:65323,41932:65324,41933:65325,41934:65326,41935:65327,41936:65328,41937:65329,41938:65330,41939:65331,41940:65332,41941:65333,41942:65334,41943:65335,41944:65336,41945:65337,41946:65338,41947:65339,41948:65340,41949:65341,41950:65342,41951:65343,41952:65344,41953:65345,41954:65346,41955:65347,41956:65348,41957:65349,41958:65350,41959:65351,41960:65352,41961:65353,41962:65354,41963:65355,41964:65356,41965:65357,41966:65358,41967:65359,41968:65360,41969:65361,41970:65362,41971:65363,41972:65364,41973:65365,41974:65366,41975:65367,41976:65368,41977:65369,41978:65370,41979:65371,41980:65372,41981:65373,41982:65507,42048:58854,42049:58855,42050:58856,42051:58857,42052:58858,42053:58859,42054:58860,42055:58861,42056:58862,42057:58863,42058:58864,42059:58865,42060:58866,42061:58867,42062:58868,42063:58869,42064:58870,42065:58871,42066:58872,42067:58873,42068:58874,42069:58875,42070:58876,42071:58877,42072:58878,42073:58879,42074:58880,42075:58881,42076:58882,42077:58883,42078:58884,42079:58885,42080:58886,42081:58887,42082:58888,42083:58889,42084:58890,42085:58891,42086:58892,42087:58893,42088:58894,42089:58895,42090:58896,42091:58897,42092:58898,42093:58899,42094:58900,42095:58901,42096:58902,42097:58903,42098:58904,42099:58905,42100:58906,42101:58907,42102:58908,42103:58909,42104:58910,42105:58911,42106:58912,42107:58913,42108:58914,42109:58915,42110:58916,42112:58917,42113:58918,42114:58919,42115:58920,42116:58921,42117:58922,42118:58923,42119:58924,42120:58925,42121:58926,42122:58927,42123:58928,42124:58929,42125:58930,42126:58931,42127:58932,42128:58933,42129:58934,42130:58935,42131:58936,42132:58937,42133:58938,42134:58939,42135:58940,42136:58941,42137:58942,42138:58943,42139:58944,42140:58945,42141:58946,42142:58947,42143:58948,42144:58949,42145:12353,42146:12354,42147:12355,42148:12356,42149:12357,42150:12358,42151:12359,42152:12360,42153:12361,42154:12362,42155:12363,42156:12364,42157:12365,42158:12366,42159:12367,42160:12368,42161:12369,42162:12370,42163:12371,42164:12372,42165:12373,42166:12374,42167:12375,42168:12376,42169:12377,42170:12378,42171:12379,42172:12380,42173:12381,42174:12382,42175:12383,42176:12384,42177:12385,42178:12386,42179:12387,42180:12388,42181:12389,42182:12390,42183:12391,42184:12392,42185:12393,42186:12394,42187:12395,42188:12396,42189:12397,42190:12398,42191:12399,42192:12400,42193:12401,42194:12402,42195:12403,42196:12404,42197:12405,42198:12406,42199:12407,42200:12408,42201:12409,42202:12410,42203:12411,42204:12412,42205:12413,42206:12414,42207:12415,42208:12416,42209:12417,42210:12418,42211:12419,42212:12420,42213:12421,42214:12422,42215:12423,42216:12424,42217:12425,42218:12426,42219:12427,42220:12428,42221:12429,42222:12430,42223:12431,42224:12432,42225:12433,42226:12434,42227:12435,42228:59250,42229:59251,42230:59252,42231:59253,42232:59254,42233:59255,42234:59256,42235:59257,42236:59258,42237:59259,42238:59260,42304:58950,42305:58951,42306:58952,42307:58953,42308:58954,42309:58955,42310:58956,42311:58957,42312:58958,42313:58959,42314:58960,42315:58961,42316:58962,42317:58963,42318:58964,42319:58965,42320:58966,42321:58967,42322:58968,42323:58969,42324:58970,42325:58971,42326:58972,42327:58973,42328:58974,42329:58975,42330:58976,42331:58977,42332:58978,42333:58979,42334:58980,42335:58981,42336:58982,42337:58983,42338:58984,42339:58985,42340:58986,42341:58987,42342:58988,42343:58989,42344:58990,42345:58991,42346:58992,42347:58993,42348:58994,42349:58995,42350:58996,42351:58997,42352:58998,42353:58999,42354:59000,42355:59001,42356:59002,42357:59003,42358:59004,42359:59005,42360:59006,42361:59007,42362:59008,42363:59009,42364:59010,42365:59011,42366:59012,42368:59013,42369:59014,42370:59015,42371:59016,42372:59017,42373:59018,42374:59019,42375:59020,42376:59021,42377:59022,42378:59023,42379:59024,42380:59025,42381:59026,42382:59027,42383:59028,42384:59029,42385:59030,42386:59031,42387:59032,42388:59033,42389:59034,42390:59035,42391:59036,42392:59037,42393:59038,42394:59039,42395:59040,42396:59041,42397:59042,42398:59043,42399:59044,42400:59045,42401:12449,42402:12450,42403:12451,42404:12452,42405:12453,42406:12454,42407:12455,42408:12456,42409:12457,42410:12458,42411:12459,42412:12460,42413:12461,42414:12462,42415:12463,42416:12464,42417:12465,42418:12466,42419:12467,42420:12468,42421:12469,42422:12470,42423:12471,42424:12472,42425:12473,42426:12474,42427:12475,42428:12476,42429:12477,42430:12478,42431:12479,42432:12480,42433:12481,42434:12482,42435:12483,42436:12484,42437:12485,42438:12486,42439:12487,42440:12488,42441:12489,42442:12490,42443:12491,42444:12492,42445:12493,42446:12494,42447:12495,42448:12496,42449:12497,42450:12498,42451:12499,42452:12500,42453:12501,42454:12502,42455:12503,42456:12504,42457:12505,42458:12506,42459:12507,42460:12508,42461:12509,42462:12510,42463:12511,42464:12512,42465:12513,42466:12514,42467:12515,42468:12516,42469:12517,42470:12518,42471:12519,42472:12520,42473:12521,42474:12522,42475:12523,42476:12524,42477:12525,42478:12526,42479:12527,42480:12528,42481:12529,42482:12530,42483:12531,42484:12532,42485:12533,42486:12534,42487:59261,42488:59262,42489:59263,42490:59264,42491:59265,42492:59266,42493:59267,42494:59268,42560:59046,42561:59047,42562:59048,42563:59049,42564:59050,42565:59051,42566:59052,42567:59053,42568:59054,42569:59055,42570:59056,42571:59057,42572:59058,42573:59059,42574:59060,42575:59061,42576:59062,42577:59063,42578:59064,42579:59065,42580:59066,42581:59067,42582:59068,42583:59069,42584:59070,42585:59071,42586:59072,42587:59073,42588:59074,42589:59075,42590:59076,42591:59077,42592:59078,42593:59079,42594:59080,42595:59081,42596:59082,42597:59083,42598:59084,42599:59085,42600:59086,42601:59087,42602:59088,42603:59089,42604:59090,42605:59091,42606:59092,42607:59093,42608:59094,42609:59095,42610:59096,42611:59097,42612:59098,42613:59099,42614:59100,42615:59101,42616:59102,42617:59103,42618:59104,42619:59105,42620:59106,42621:59107,42622:59108,42624:59109,42625:59110,42626:59111,42627:59112,42628:59113,42629:59114,42630:59115,42631:59116,42632:59117,42633:59118,42634:59119,42635:59120,42636:59121,42637:59122,42638:59123,42639:59124,42640:59125,42641:59126,42642:59127,42643:59128,42644:59129,42645:59130,42646:59131,42647:59132,42648:59133,42649:59134,42650:59135,42651:59136,42652:59137,42653:59138,42654:59139,42655:59140,42656:59141,42657:913,42658:914,42659:915,42660:916,42661:917,42662:918,42663:919,42664:920,42665:921,42666:922,42667:923,42668:924,42669:925,42670:926,42671:927,42672:928,42673:929,42674:931,42675:932,42676:933,42677:934,42678:935,42679:936,42680:937,42681:59269,42682:59270,42683:59271,42684:59272,42685:59273,42686:59274,42687:59275,42688:59276,42689:945,42690:946,42691:947,42692:948,42693:949,42694:950,42695:951,42696:952,42697:953,42698:954,42699:955,42700:956,42701:957,42702:958,42703:959,42704:960,42705:961,42706:963,42707:964,42708:965,42709:966,42710:967,42711:968,42712:969,42713:59277,42714:59278,42715:59279,42716:59280,42717:59281,42718:59282,42719:59283,42720:65077,42721:65078,42722:65081,42723:65082,42724:65087,42725:65088,42726:65085,42727:65086,42728:65089,42729:65090,42730:65091,42731:65092,42732:59284,42733:59285,42734:65083,42735:65084,42736:65079,42737:65080,42738:65073,42739:59286,42740:65075,42741:65076,42742:59287,42743:59288,42744:59289,42745:59290,42746:59291,42747:59292,42748:59293,42749:59294,42750:59295,42816:59142,42817:59143,42818:59144,42819:59145,42820:59146,42821:59147,42822:59148,42823:59149,42824:59150,42825:59151,42826:59152,42827:59153,42828:59154,42829:59155,42830:59156,42831:59157,42832:59158,42833:59159,42834:59160,42835:59161,42836:59162,42837:59163,42838:59164,42839:59165,42840:59166,42841:59167,42842:59168,42843:59169,42844:59170,42845:59171,42846:59172,42847:59173,42848:59174,42849:59175,42850:59176,42851:59177,42852:59178,42853:59179,42854:59180,42855:59181,42856:59182,42857:59183,42858:59184,42859:59185,42860:59186,42861:59187,42862:59188,42863:59189,42864:59190,42865:59191,42866:59192,42867:59193,42868:59194,42869:59195,42870:59196,42871:59197,42872:59198,42873:59199,42874:59200,42875:59201,42876:59202,42877:59203,42878:59204,42880:59205,42881:59206,42882:59207,42883:59208,42884:59209,42885:59210,42886:59211,42887:59212,42888:59213,42889:59214,42890:59215,42891:59216,42892:59217,42893:59218,42894:59219,42895:59220,42896:59221,42897:59222,42898:59223,42899:59224,42900:59225,42901:59226,42902:59227,42903:59228,42904:59229,42905:59230,42906:59231,42907:59232,42908:59233,42909:59234,42910:59235,42911:59236,42912:59237,42913:1040,42914:1041,42915:1042,42916:1043,42917:1044,42918:1045,42919:1025,42920:1046,42921:1047,42922:1048,42923:1049,42924:1050,42925:1051,42926:1052,42927:1053,42928:1054,42929:1055,42930:1056,42931:1057,42932:1058,42933:1059,42934:1060,42935:1061,42936:1062,42937:1063,42938:1064,42939:1065,42940:1066,42941:1067,42942:1068,42943:1069,42944:1070,42945:1071,42946:59296,42947:59297,42948:59298,42949:59299,42950:59300,42951:59301,42952:59302,42953:59303,42954:59304,42955:59305,42956:59306,42957:59307,42958:59308,42959:59309,42960:59310,42961:1072,42962:1073,42963:1074,42964:1075,42965:1076,42966:1077,42967:1105,42968:1078,42969:1079,42970:1080,42971:1081,42972:1082,42973:1083,42974:1084,42975:1085,42976:1086,42977:1087,42978:1088,42979:1089,42980:1090,42981:1091,42982:1092,42983:1093,42984:1094,42985:1095,42986:1096,42987:1097,42988:1098,42989:1099,42990:1100,42991:1101,42992:1102,42993:1103,42994:59311,42995:59312,42996:59313,42997:59314,42998:59315,42999:59316,43000:59317,43001:59318,43002:59319,43003:59320,43004:59321,43005:59322,43006:59323,43072:714,43073:715,43074:729,43075:8211,43076:8213,43077:8229,43078:8245,43079:8453,43080:8457,43081:8598,43082:8599,43083:8600,43084:8601,43085:8725,43086:8735,43087:8739,43088:8786,43089:8806,43090:8807,43091:8895,43092:9552,43093:9553,43094:9554,43095:9555,43096:9556,43097:9557,43098:9558,43099:9559,43100:9560,43101:9561,43102:9562,43103:9563,43104:9564,43105:9565,43106:9566,43107:9567,43108:9568,43109:9569,43110:9570,43111:9571,43112:9572,43113:9573,43114:9574,43115:9575,43116:9576,43117:9577,43118:9578,43119:9579,43120:9580,43121:9581,43122:9582,43123:9583,43124:9584,43125:9585,43126:9586,43127:9587,43128:9601,43129:9602,43130:9603,43131:9604,43132:9605,43133:9606,43134:9607,43136:9608,43137:9609,43138:9610,43139:9611,43140:9612,43141:9613,43142:9614,43143:9615,43144:9619,43145:9620,43146:9621,43147:9660,43148:9661,43149:9698,43150:9699,43151:9700,43152:9701,43153:9737,43154:8853,43155:12306,43156:12317,43157:12318,43158:59324,43159:59325,43160:59326,43161:59327,43162:59328,43163:59329,43164:59330,43165:59331,43166:59332,43167:59333,43168:59334,43169:257,43170:225,43171:462,43172:224,43173:275,43174:233,43175:283,43176:232,43177:299,43178:237,43179:464,43180:236,43181:333,43182:243,43183:466,43184:242,43185:363,43186:250,43187:468,43188:249,43189:470,43190:472,43191:474,43192:476,43193:252,43194:234,43195:593,43196:59335,43197:324,43198:328,43199:505,43200:609,43201:59337,43202:59338,43203:59339,43204:59340,43205:12549,43206:12550,43207:12551,43208:12552,43209:12553,43210:12554,43211:12555,43212:12556,43213:12557,43214:12558,43215:12559,43216:12560,43217:12561,43218:12562,43219:12563,43220:12564,43221:12565,43222:12566,43223:12567,43224:12568,43225:12569,43226:12570,43227:12571,43228:12572,43229:12573,43230:12574,43231:12575,43232:12576,43233:12577,43234:12578,43235:12579,43236:12580,43237:12581,43238:12582,43239:12583,43240:12584,43241:12585,43242:59341,43243:59342,43244:59343,43245:59344,43246:59345,43247:59346,43248:59347,43249:59348,43250:59349,43251:59350,43252:59351,43253:59352,43254:59353,43255:59354,43256:59355,43257:59356,43258:59357,43259:59358,43260:59359,43261:59360,43262:59361,43328:12321,43329:12322,43330:12323,43331:12324,43332:12325,43333:12326,43334:12327,43335:12328,43336:12329,43337:12963,43338:13198,43339:13199,43340:13212,43341:13213,43342:13214,43343:13217,43344:13252,43345:13262,43346:13265,43347:13266,43348:13269,43349:65072,43350:65506,43351:65508,43352:59362,43353:8481,43354:12849,43355:59363,43356:8208,43357:59364,43358:59365,43359:59366,43360:12540,43361:12443,43362:12444,43363:12541,43364:12542,43365:12294,43366:12445,43367:12446,43368:65097,43369:65098,43370:65099,43371:65100,43372:65101,43373:65102,43374:65103,43375:65104,43376:65105,43377:65106,43378:65108,43379:65109,43380:65110,43381:65111,43382:65113,43383:65114,43384:65115,43385:65116,43386:65117,43387:65118,43388:65119,43389:65120,43390:65121,43392:65122,43393:65123,43394:65124,43395:65125,43396:65126,43397:65128,43398:65129,43399:65130,43400:65131,43401:12350,43402:12272,43403:12273,43404:12274,43405:12275,43406:12276,43407:12277,43408:12278,43409:12279,43410:12280,43411:12281,43412:12282,43413:12283,43414:12295,43415:59380,43416:59381,43417:59382,43418:59383,43419:59384,43420:59385,43421:59386,43422:59387,43423:59388,43424:59389,43425:59390,43426:59391,43427:59392,43428:9472,43429:9473,43430:9474,43431:9475,43432:9476,43433:9477,43434:9478,43435:9479,43436:9480,43437:9481,43438:9482,43439:9483,43440:9484,43441:9485,43442:9486,43443:9487,43444:9488,43445:9489,43446:9490,43447:9491,43448:9492,43449:9493,43450:9494,43451:9495,43452:9496,43453:9497,43454:9498,43455:9499,43456:9500,43457:9501,43458:9502,43459:9503,43460:9504,43461:9505,43462:9506,43463:9507,43464:9508,43465:9509,43466:9510,43467:9511,43468:9512,43469:9513,43470:9514,43471:9515,43472:9516,43473:9517,43474:9518,43475:9519,43476:9520,43477:9521,43478:9522,43479:9523,43480:9524,43481:9525,43482:9526,43483:9527,43484:9528,43485:9529,43486:9530,43487:9531,43488:9532,43489:9533,43490:9534,43491:9535,43492:9536,43493:9537,43494:9538,43495:9539,43496:9540,43497:9541,43498:9542,43499:9543,43500:9544,43501:9545,43502:9546,43503:9547,43504:59393,43505:59394,43506:59395,43507:59396,43508:59397,43509:59398,43510:59399,43511:59400,43512:59401,43513:59402,43514:59403,43515:59404,43516:59405,43517:59406,43518:59407,43584:29404,43585:29405,43586:29407,43587:29410,43588:29411,43589:29412,43590:29413,43591:29414,43592:29415,43593:29418,43594:29419,43595:29429,43596:29430,43597:29433,43598:29437,43599:29438,43600:29439,43601:29440,43602:29442,43603:29444,43604:29445,43605:29446,43606:29447,43607:29448,43608:29449,43609:29451,43610:29452,43611:29453,43612:29455,43613:29456,43614:29457,43615:29458,43616:29460,43617:29464,43618:29465,43619:29466,43620:29471,43621:29472,43622:29475,43623:29476,43624:29478,43625:29479,43626:29480,43627:29485,43628:29487,43629:29488,43630:29490,43631:29491,43632:29493,43633:29494,43634:29498,43635:29499,43636:29500,43637:29501,43638:29504,43639:29505,43640:29506,43641:29507,43642:29508,43643:29509,43644:29510,43645:29511,43646:29512,43648:29513,43649:29514,43650:29515,43651:29516,43652:29518,43653:29519,43654:29521,43655:29523,43656:29524,43657:29525,43658:29526,43659:29528,43660:29529,43661:29530,43662:29531,43663:29532,43664:29533,43665:29534,43666:29535,43667:29537,43668:29538,43669:29539,43670:29540,43671:29541,43672:29542,43673:29543,43674:29544,43675:29545,43676:29546,43677:29547,43678:29550,43679:29552,43680:29553,43681:57344,43682:57345,43683:57346,43684:57347,43685:57348,43686:57349,43687:57350,43688:57351,43689:57352,43690:57353,43691:57354,43692:57355,43693:57356,43694:57357,43695:57358,43696:57359,43697:57360,43698:57361,43699:57362,43700:57363,43701:57364,43702:57365,43703:57366,43704:57367,43705:57368,43706:57369,43707:57370,43708:57371,43709:57372,43710:57373,43711:57374,43712:57375,43713:57376,43714:57377,43715:57378,43716:57379,43717:57380,43718:57381,43719:57382,43720:57383,43721:57384,43722:57385,43723:57386,43724:57387,43725:57388,43726:57389,43727:57390,43728:57391,43729:57392,43730:57393,43731:57394,43732:57395,43733:57396,43734:57397,43735:57398,43736:57399,43737:57400,43738:57401,43739:57402,43740:57403,43741:57404,43742:57405,43743:57406,43744:57407,43745:57408,43746:57409,43747:57410,43748:57411,43749:57412,43750:57413,43751:57414,43752:57415,43753:57416,43754:57417,43755:57418,43756:57419,43757:57420,43758:57421,43759:57422,43760:57423,43761:57424,43762:57425,43763:57426,43764:57427,43765:57428,43766:57429,43767:57430,43768:57431,43769:57432,43770:57433,43771:57434,43772:57435,43773:57436,43774:57437,43840:29554,43841:29555,43842:29556,43843:29557,43844:29558,43845:29559,43846:29560,43847:29561,43848:29562,43849:29563,43850:29564,43851:29565,43852:29567,43853:29568,43854:29569,43855:29570,43856:29571,43857:29573,43858:29574,43859:29576,43860:29578,43861:29580,43862:29581,43863:29583,43864:29584,43865:29586,43866:29587,43867:29588,43868:29589,43869:29591,43870:29592,43871:29593,43872:29594,43873:29596,43874:29597,43875:29598,43876:29600,43877:29601,43878:29603,43879:29604,43880:29605,43881:29606,43882:29607,43883:29608,43884:29610,43885:29612,43886:29613,43887:29617,43888:29620,43889:29621,43890:29622,43891:29624,43892:29625,43893:29628,43894:29629,43895:29630,43896:29631,43897:29633,43898:29635,43899:29636,43900:29637,43901:29638,43902:29639,43904:29643,43905:29644,43906:29646,43907:29650,43908:29651,43909:29652,43910:29653,43911:29654,43912:29655,43913:29656,43914:29658,43915:29659,43916:29660,43917:29661,43918:29663,43919:29665,43920:29666,43921:29667,43922:29668,43923:29670,43924:29672,43925:29674,43926:29675,43927:29676,43928:29678,43929:29679,43930:29680,43931:29681,43932:29683,43933:29684,43934:29685,43935:29686,43936:29687,43937:57438,43938:57439,43939:57440,43940:57441,43941:57442,43942:57443,43943:57444,43944:57445,43945:57446,43946:57447,43947:57448,43948:57449,43949:57450,43950:57451,43951:57452,43952:57453,43953:57454,43954:57455,43955:57456,43956:57457,43957:57458,43958:57459,43959:57460,43960:57461,43961:57462,43962:57463,43963:57464,43964:57465,43965:57466,43966:57467,43967:57468,43968:57469,43969:57470,43970:57471,43971:57472,43972:57473,43973:57474,43974:57475,43975:57476,43976:57477,43977:57478,43978:57479,43979:57480,43980:57481,43981:57482,43982:57483,43983:57484,43984:57485,43985:57486,43986:57487,43987:57488,43988:57489,43989:57490,43990:57491,43991:57492,43992:57493,43993:57494,43994:57495,43995:57496,43996:57497,43997:57498,43998:57499,43999:57500,44000:57501,44001:57502,44002:57503,44003:57504,44004:57505,44005:57506,44006:57507,44007:57508,44008:57509,44009:57510,44010:57511,44011:57512,44012:57513,44013:57514,44014:57515,44015:57516,44016:57517,44017:57518,44018:57519,44019:57520,44020:57521,44021:57522,44022:57523,44023:57524,44024:57525,44025:57526,44026:57527,44027:57528,44028:57529,44029:57530,44030:57531,44096:29688,44097:29689,44098:29690,44099:29691,44100:29692,44101:29693,44102:29694,44103:29695,44104:29696,44105:29697,44106:29698,44107:29700,44108:29703,44109:29704,44110:29707,44111:29708,44112:29709,44113:29710,44114:29713,44115:29714,44116:29715,44117:29716,44118:29717,44119:29718,44120:29719,44121:29720,44122:29721,44123:29724,44124:29725,44125:29726,44126:29727,44127:29728,44128:29729,44129:29731,44130:29732,44131:29735,44132:29737,44133:29739,44134:29741,44135:29743,44136:29745,44137:29746,44138:29751,44139:29752,44140:29753,44141:29754,44142:29755,44143:29757,44144:29758,44145:29759,44146:29760,44147:29762,44148:29763,44149:29764,44150:29765,44151:29766,44152:29767,44153:29768,44154:29769,44155:29770,44156:29771,44157:29772,44158:29773,44160:29774,44161:29775,44162:29776,44163:29777,44164:29778,44165:29779,44166:29780,44167:29782,44168:29784,44169:29789,44170:29792,44171:29793,44172:29794,44173:29795,44174:29796,44175:29797,44176:29798,44177:29799,44178:29800,44179:29801,44180:29802,44181:29803,44182:29804,44183:29806,44184:29807,44185:29809,44186:29810,44187:29811,44188:29812,44189:29813,44190:29816,44191:29817,44192:29818,44193:57532,44194:57533,44195:57534,44196:57535,44197:57536,44198:57537,44199:57538,44200:57539,44201:57540,44202:57541,44203:57542,44204:57543,44205:57544,44206:57545,44207:57546,44208:57547,44209:57548,44210:57549,44211:57550,44212:57551,44213:57552,44214:57553,44215:57554,44216:57555,44217:57556,44218:57557,44219:57558,44220:57559,44221:57560,44222:57561,44223:57562,44224:57563,44225:57564,44226:57565,44227:57566,44228:57567,44229:57568,44230:57569,44231:57570,44232:57571,44233:57572,44234:57573,44235:57574,44236:57575,44237:57576,44238:57577,44239:57578,44240:57579,44241:57580,44242:57581,44243:57582,44244:57583,44245:57584,44246:57585,44247:57586,44248:57587,44249:57588,44250:57589,44251:57590,44252:57591,44253:57592,44254:57593,44255:57594,44256:57595,44257:57596,44258:57597,44259:57598,44260:57599,44261:57600,44262:57601,44263:57602,44264:57603,44265:57604,44266:57605,44267:57606,44268:57607,44269:57608,44270:57609,44271:57610,44272:57611,44273:57612,44274:57613,44275:57614,44276:57615,44277:57616,44278:57617,44279:57618,44280:57619,44281:57620,44282:57621,44283:57622,44284:57623,44285:57624,44286:57625,44352:29819,44353:29820,44354:29821,44355:29823,44356:29826,44357:29828,44358:29829,44359:29830,44360:29832,44361:29833,44362:29834,44363:29836,44364:29837,44365:29839,44366:29841,44367:29842,44368:29843,44369:29844,44370:29845,44371:29846,44372:29847,44373:29848,44374:29849,44375:29850,44376:29851,44377:29853,44378:29855,44379:29856,44380:29857,44381:29858,44382:29859,44383:29860,44384:29861,44385:29862,44386:29866,44387:29867,44388:29868,44389:29869,44390:29870,44391:29871,44392:29872,44393:29873,44394:29874,44395:29875,44396:29876,44397:29877,44398:29878,44399:29879,44400:29880,44401:29881,44402:29883,44403:29884,44404:29885,44405:29886,44406:29887,44407:29888,44408:29889,44409:29890,44410:29891,44411:29892,44412:29893,44413:29894,44414:29895,44416:29896,44417:29897,44418:29898,44419:29899,44420:29900,44421:29901,44422:29902,44423:29903,44424:29904,44425:29905,44426:29907,44427:29908,44428:29909,44429:29910,44430:29911,44431:29912,44432:29913,44433:29914,44434:29915,44435:29917,44436:29919,44437:29921,44438:29925,44439:29927,44440:29928,44441:29929,44442:29930,44443:29931,44444:29932,44445:29933,44446:29936,44447:29937,44448:29938,44449:57626,44450:57627,44451:57628,44452:57629,44453:57630,44454:57631,44455:57632,44456:57633,44457:57634,44458:57635,44459:57636,44460:57637,44461:57638,44462:57639,44463:57640,44464:57641,44465:57642,44466:57643,44467:57644,44468:57645,44469:57646,44470:57647,44471:57648,44472:57649,44473:57650,44474:57651,44475:57652,44476:57653,44477:57654,44478:57655,44479:57656,44480:57657,44481:57658,44482:57659,44483:57660,44484:57661,44485:57662,44486:57663,44487:57664,44488:57665,44489:57666,44490:57667,44491:57668,44492:57669,44493:57670,44494:57671,44495:57672,44496:57673,44497:57674,44498:57675,44499:57676,44500:57677,44501:57678,44502:57679,44503:57680,44504:57681,44505:57682,44506:57683,44507:57684,44508:57685,44509:57686,44510:57687,44511:57688,44512:57689,44513:57690,44514:57691,44515:57692,44516:57693,44517:57694,44518:57695,44519:57696,44520:57697,44521:57698,44522:57699,44523:57700,44524:57701,44525:57702,44526:57703,44527:57704,44528:57705,44529:57706,44530:57707,44531:57708,44532:57709,44533:57710,44534:57711,44535:57712,44536:57713,44537:57714,44538:57715,44539:57716,44540:57717,44541:57718,44542:57719,44608:29939,44609:29941,44610:29944,44611:29945,44612:29946,44613:29947,44614:29948,44615:29949,44616:29950,44617:29952,44618:29953,44619:29954,44620:29955,44621:29957,44622:29958,44623:29959,44624:29960,44625:29961,44626:29962,44627:29963,44628:29964,44629:29966,44630:29968,44631:29970,44632:29972,44633:29973,44634:29974,44635:29975,44636:29979,44637:29981,44638:29982,44639:29984,44640:29985,44641:29986,44642:29987,44643:29988,44644:29990,44645:29991,44646:29994,44647:29998,44648:30004,44649:30006,44650:30009,44651:30012,44652:30013,44653:30015,44654:30017,44655:30018,44656:30019,44657:30020,44658:30022,44659:30023,44660:30025,44661:30026,44662:30029,44663:30032,44664:30033,44665:30034,44666:30035,44667:30037,44668:30038,44669:30039,44670:30040,44672:30045,44673:30046,44674:30047,44675:30048,44676:30049,44677:30050,44678:30051,44679:30052,44680:30055,44681:30056,44682:30057,44683:30059,44684:30060,44685:30061,44686:30062,44687:30063,44688:30064,44689:30065,44690:30067,44691:30069,44692:30070,44693:30071,44694:30074,44695:30075,44696:30076,44697:30077,44698:30078,44699:30080,44700:30081,44701:30082,44702:30084,44703:30085,44704:30087,44705:57720,44706:57721,44707:57722,44708:57723,44709:57724,44710:57725,44711:57726,44712:57727,44713:57728,44714:57729,44715:57730,44716:57731,44717:57732,44718:57733,44719:57734,44720:57735,44721:57736,44722:57737,44723:57738,44724:57739,44725:57740,44726:57741,44727:57742,44728:57743,44729:57744,44730:57745,44731:57746,44732:57747,44733:57748,44734:57749,44735:57750,44736:57751,44737:57752,44738:57753,44739:57754,44740:57755,44741:57756,44742:57757,44743:57758,44744:57759,44745:57760,44746:57761,44747:57762,44748:57763,44749:57764,44750:57765,44751:57766,44752:57767,44753:57768,44754:57769,44755:57770,44756:57771,44757:57772,44758:57773,44759:57774,44760:57775,44761:57776,44762:57777,44763:57778,44764:57779,44765:57780,44766:57781,44767:57782,44768:57783,44769:57784,44770:57785,44771:57786,44772:57787,44773:57788,44774:57789,44775:57790,44776:57791,44777:57792,44778:57793,44779:57794,44780:57795,44781:57796,44782:57797,44783:57798,44784:57799,44785:57800,44786:57801,44787:57802,44788:57803,44789:57804,44790:57805,44791:57806,44792:57807,44793:57808,44794:57809,44795:57810,44796:57811,44797:57812,44798:57813,44864:30088,44865:30089,44866:30090,44867:30092,44868:30093,44869:30094,44870:30096,44871:30099,44872:30101,44873:30104,44874:30107,44875:30108,44876:30110,44877:30114,44878:30118,44879:30119,44880:30120,44881:30121,44882:30122,44883:30125,44884:30134,44885:30135,44886:30138,44887:30139,44888:30143,44889:30144,44890:30145,44891:30150,44892:30155,44893:30156,44894:30158,44895:30159,44896:30160,44897:30161,44898:30163,44899:30167,44900:30169,44901:30170,44902:30172,44903:30173,44904:30175,44905:30176,44906:30177,44907:30181,44908:30185,44909:30188,44910:30189,44911:30190,44912:30191,44913:30194,44914:30195,44915:30197,44916:30198,44917:30199,44918:30200,44919:30202,44920:30203,44921:30205,44922:30206,44923:30210,44924:30212,44925:30214,44926:30215,44928:30216,44929:30217,44930:30219,44931:30221,44932:30222,44933:30223,44934:30225,44935:30226,44936:30227,44937:30228,44938:30230,44939:30234,44940:30236,44941:30237,44942:30238,44943:30241,44944:30243,44945:30247,44946:30248,44947:30252,44948:30254,44949:30255,44950:30257,44951:30258,44952:30262,44953:30263,44954:30265,44955:30266,44956:30267,44957:30269,44958:30273,44959:30274,44960:30276,44961:57814,44962:57815,44963:57816,44964:57817,44965:57818,44966:57819,44967:57820,44968:57821,44969:57822,44970:57823,44971:57824,44972:57825,44973:57826,44974:57827,44975:57828,44976:57829,44977:57830,44978:57831,44979:57832,44980:57833,44981:57834,44982:57835,44983:57836,44984:57837,44985:57838,44986:57839,44987:57840,44988:57841,44989:57842,44990:57843,44991:57844,44992:57845,44993:57846,44994:57847,44995:57848,44996:57849,44997:57850,44998:57851,44999:57852,45000:57853,45001:57854,45002:57855,45003:57856,45004:57857,45005:57858,45006:57859,45007:57860,45008:57861,45009:57862,45010:57863,45011:57864,45012:57865,45013:57866,45014:57867,45015:57868,45016:57869,45017:57870,45018:57871,45019:57872,45020:57873,45021:57874,45022:57875,45023:57876,45024:57877,45025:57878,45026:57879,45027:57880,45028:57881,45029:57882,45030:57883,45031:57884,45032:57885,45033:57886,45034:57887,45035:57888,45036:57889,45037:57890,45038:57891,45039:57892,45040:57893,45041:57894,45042:57895,45043:57896,45044:57897,45045:57898,45046:57899,45047:57900,45048:57901,45049:57902,45050:57903,45051:57904,45052:57905,45053:57906,45054:57907,45120:30277,45121:30278,45122:30279,45123:30280,45124:30281,45125:30282,45126:30283,45127:30286,45128:30287,45129:30288,45130:30289,45131:30290,45132:30291,45133:30293,45134:30295,45135:30296,45136:30297,45137:30298,45138:30299,45139:30301,45140:30303,45141:30304,45142:30305,45143:30306,45144:30308,45145:30309,45146:30310,45147:30311,45148:30312,45149:30313,45150:30314,45151:30316,45152:30317,45153:30318,45154:30320,45155:30321,45156:30322,45157:30323,45158:30324,45159:30325,45160:30326,45161:30327,45162:30329,45163:30330,45164:30332,45165:30335,45166:30336,45167:30337,45168:30339,45169:30341,45170:30345,45171:30346,45172:30348,45173:30349,45174:30351,45175:30352,45176:30354,45177:30356,45178:30357,45179:30359,45180:30360,45181:30362,45182:30363,45184:30364,45185:30365,45186:30366,45187:30367,45188:30368,45189:30369,45190:30370,45191:30371,45192:30373,45193:30374,45194:30375,45195:30376,45196:30377,45197:30378,45198:30379,45199:30380,45200:30381,45201:30383,45202:30384,45203:30387,45204:30389,45205:30390,45206:30391,45207:30392,45208:30393,45209:30394,45210:30395,45211:30396,45212:30397,45213:30398,45214:30400,45215:30401,45216:30403,45217:21834,45218:38463,45219:22467,45220:25384,45221:21710,45222:21769,45223:21696,45224:30353,45225:30284,45226:34108,45227:30702,45228:33406,45229:30861,45230:29233,45231:38552,45232:38797,45233:27688,45234:23433,45235:20474,45236:25353,45237:26263,45238:23736,45239:33018,45240:26696,45241:32942,45242:26114,45243:30414,45244:20985,45245:25942,45246:29100,45247:32753,45248:34948,45249:20658,45250:22885,45251:25034,45252:28595,45253:33453,45254:25420,45255:25170,45256:21485,45257:21543,45258:31494,45259:20843,45260:30116,45261:24052,45262:25300,45263:36299,45264:38774,45265:25226,45266:32793,45267:22365,45268:38712,45269:32610,45270:29240,45271:30333,45272:26575,45273:30334,45274:25670,45275:20336,45276:36133,45277:25308,45278:31255,45279:26001,45280:29677,45281:25644,45282:25203,45283:33324,45284:39041,45285:26495,45286:29256,45287:25198,45288:25292,45289:20276,45290:29923,45291:21322,45292:21150,45293:32458,45294:37030,45295:24110,45296:26758,45297:27036,45298:33152,45299:32465,45300:26834,45301:30917,45302:34444,45303:38225,45304:20621,45305:35876,45306:33502,45307:32990,45308:21253,45309:35090,45310:21093,45376:30404,45377:30407,45378:30409,45379:30411,45380:30412,45381:30419,45382:30421,45383:30425,45384:30426,45385:30428,45386:30429,45387:30430,45388:30432,45389:30433,45390:30434,45391:30435,45392:30436,45393:30438,45394:30439,45395:30440,45396:30441,45397:30442,45398:30443,45399:30444,45400:30445,45401:30448,45402:30451,45403:30453,45404:30454,45405:30455,45406:30458,45407:30459,45408:30461,45409:30463,45410:30464,45411:30466,45412:30467,45413:30469,45414:30470,45415:30474,45416:30476,45417:30478,45418:30479,45419:30480,45420:30481,45421:30482,45422:30483,45423:30484,45424:30485,45425:30486,45426:30487,45427:30488,45428:30491,45429:30492,45430:30493,45431:30494,45432:30497,45433:30499,45434:30500,45435:30501,45436:30503,45437:30506,45438:30507,45440:30508,45441:30510,45442:30512,45443:30513,45444:30514,45445:30515,45446:30516,45447:30521,45448:30523,45449:30525,45450:30526,45451:30527,45452:30530,45453:30532,45454:30533,45455:30534,45456:30536,45457:30537,45458:30538,45459:30539,45460:30540,45461:30541,45462:30542,45463:30543,45464:30546,45465:30547,45466:30548,45467:30549,45468:30550,45469:30551,45470:30552,45471:30553,45472:30556,45473:34180,45474:38649,45475:20445,45476:22561,45477:39281,45478:23453,45479:25265,45480:25253,45481:26292,45482:35961,45483:40077,45484:29190,45485:26479,45486:30865,45487:24754,45488:21329,45489:21271,45490:36744,45491:32972,45492:36125,45493:38049,45494:20493,45495:29384,45496:22791,45497:24811,45498:28953,45499:34987,45500:22868,45501:33519,45502:26412,45503:31528,45504:23849,45505:32503,45506:29997,45507:27893,45508:36454,45509:36856,45510:36924,45511:40763,45512:27604,45513:37145,45514:31508,45515:24444,45516:30887,45517:34006,45518:34109,45519:27605,45520:27609,45521:27606,45522:24065,45523:24199,45524:30201,45525:38381,45526:25949,45527:24330,45528:24517,45529:36767,45530:22721,45531:33218,45532:36991,45533:38491,45534:38829,45535:36793,45536:32534,45537:36140,45538:25153,45539:20415,45540:21464,45541:21342,45542:36776,45543:36777,45544:36779,45545:36941,45546:26631,45547:24426,45548:33176,45549:34920,45550:40150,45551:24971,45552:21035,45553:30250,45554:24428,45555:25996,45556:28626,45557:28392,45558:23486,45559:25672,45560:20853,45561:20912,45562:26564,45563:19993,45564:31177,45565:39292,45566:28851,45632:30557,45633:30558,45634:30559,45635:30560,45636:30564,45637:30567,45638:30569,45639:30570,45640:30573,45641:30574,45642:30575,45643:30576,45644:30577,45645:30578,45646:30579,45647:30580,45648:30581,45649:30582,45650:30583,45651:30584,45652:30586,45653:30587,45654:30588,45655:30593,45656:30594,45657:30595,45658:30598,45659:30599,45660:30600,45661:30601,45662:30602,45663:30603,45664:30607,45665:30608,45666:30611,45667:30612,45668:30613,45669:30614,45670:30615,45671:30616,45672:30617,45673:30618,45674:30619,45675:30620,45676:30621,45677:30622,45678:30625,45679:30627,45680:30628,45681:30630,45682:30632,45683:30635,45684:30637,45685:30638,45686:30639,45687:30641,45688:30642,45689:30644,45690:30646,45691:30647,45692:30648,45693:30649,45694:30650,45696:30652,45697:30654,45698:30656,45699:30657,45700:30658,45701:30659,45702:30660,45703:30661,45704:30662,45705:30663,45706:30664,45707:30665,45708:30666,45709:30667,45710:30668,45711:30670,45712:30671,45713:30672,45714:30673,45715:30674,45716:30675,45717:30676,45718:30677,45719:30678,45720:30680,45721:30681,45722:30682,45723:30685,45724:30686,45725:30687,45726:30688,45727:30689,45728:30692,45729:30149,45730:24182,45731:29627,45732:33760,45733:25773,45734:25320,45735:38069,45736:27874,45737:21338,45738:21187,45739:25615,45740:38082,45741:31636,45742:20271,45743:24091,45744:33334,45745:33046,45746:33162,45747:28196,45748:27850,45749:39539,45750:25429,45751:21340,45752:21754,45753:34917,45754:22496,45755:19981,45756:24067,45757:27493,45758:31807,45759:37096,45760:24598,45761:25830,45762:29468,45763:35009,45764:26448,45765:25165,45766:36130,45767:30572,45768:36393,45769:37319,45770:24425,45771:33756,45772:34081,45773:39184,45774:21442,45775:34453,45776:27531,45777:24813,45778:24808,45779:28799,45780:33485,45781:33329,45782:20179,45783:27815,45784:34255,45785:25805,45786:31961,45787:27133,45788:26361,45789:33609,45790:21397,45791:31574,45792:20391,45793:20876,45794:27979,45795:23618,45796:36461,45797:25554,45798:21449,45799:33580,45800:33590,45801:26597,45802:30900,45803:25661,45804:23519,45805:23700,45806:24046,45807:35815,45808:25286,45809:26612,45810:35962,45811:25600,45812:25530,45813:34633,45814:39307,45815:35863,45816:32544,45817:38130,45818:20135,45819:38416,45820:39076,45821:26124,45822:29462,45888:30694,45889:30696,45890:30698,45891:30703,45892:30704,45893:30705,45894:30706,45895:30708,45896:30709,45897:30711,45898:30713,45899:30714,45900:30715,45901:30716,45902:30723,45903:30724,45904:30725,45905:30726,45906:30727,45907:30728,45908:30730,45909:30731,45910:30734,45911:30735,45912:30736,45913:30739,45914:30741,45915:30745,45916:30747,45917:30750,45918:30752,45919:30753,45920:30754,45921:30756,45922:30760,45923:30762,45924:30763,45925:30766,45926:30767,45927:30769,45928:30770,45929:30771,45930:30773,45931:30774,45932:30781,45933:30783,45934:30785,45935:30786,45936:30787,45937:30788,45938:30790,45939:30792,45940:30793,45941:30794,45942:30795,45943:30797,45944:30799,45945:30801,45946:30803,45947:30804,45948:30808,45949:30809,45950:30810,45952:30811,45953:30812,45954:30814,45955:30815,45956:30816,45957:30817,45958:30818,45959:30819,45960:30820,45961:30821,45962:30822,45963:30823,45964:30824,45965:30825,45966:30831,45967:30832,45968:30833,45969:30834,45970:30835,45971:30836,45972:30837,45973:30838,45974:30840,45975:30841,45976:30842,45977:30843,45978:30845,45979:30846,45980:30847,45981:30848,45982:30849,45983:30850,45984:30851,45985:22330,45986:23581,45987:24120,45988:38271,45989:20607,45990:32928,45991:21378,45992:25950,45993:30021,45994:21809,45995:20513,45996:36229,45997:25220,45998:38046,45999:26397,46000:22066,46001:28526,46002:24034,46003:21557,46004:28818,46005:36710,46006:25199,46007:25764,46008:25507,46009:24443,46010:28552,46011:37108,46012:33251,46013:36784,46014:23576,46015:26216,46016:24561,46017:27785,46018:38472,46019:36225,46020:34924,46021:25745,46022:31216,46023:22478,46024:27225,46025:25104,46026:21576,46027:20056,46028:31243,46029:24809,46030:28548,46031:35802,46032:25215,46033:36894,46034:39563,46035:31204,46036:21507,46037:30196,46038:25345,46039:21273,46040:27744,46041:36831,46042:24347,46043:39536,46044:32827,46045:40831,46046:20360,46047:23610,46048:36196,46049:32709,46050:26021,46051:28861,46052:20805,46053:20914,46054:34411,46055:23815,46056:23456,46057:25277,46058:37228,46059:30068,46060:36364,46061:31264,46062:24833,46063:31609,46064:20167,46065:32504,46066:30597,46067:19985,46068:33261,46069:21021,46070:20986,46071:27249,46072:21416,46073:36487,46074:38148,46075:38607,46076:28353,46077:38500,46078:26970,46144:30852,46145:30853,46146:30854,46147:30856,46148:30858,46149:30859,46150:30863,46151:30864,46152:30866,46153:30868,46154:30869,46155:30870,46156:30873,46157:30877,46158:30878,46159:30880,46160:30882,46161:30884,46162:30886,46163:30888,46164:30889,46165:30890,46166:30891,46167:30892,46168:30893,46169:30894,46170:30895,46171:30901,46172:30902,46173:30903,46174:30904,46175:30906,46176:30907,46177:30908,46178:30909,46179:30911,46180:30912,46181:30914,46182:30915,46183:30916,46184:30918,46185:30919,46186:30920,46187:30924,46188:30925,46189:30926,46190:30927,46191:30929,46192:30930,46193:30931,46194:30934,46195:30935,46196:30936,46197:30938,46198:30939,46199:30940,46200:30941,46201:30942,46202:30943,46203:30944,46204:30945,46205:30946,46206:30947,46208:30948,46209:30949,46210:30950,46211:30951,46212:30953,46213:30954,46214:30955,46215:30957,46216:30958,46217:30959,46218:30960,46219:30961,46220:30963,46221:30965,46222:30966,46223:30968,46224:30969,46225:30971,46226:30972,46227:30973,46228:30974,46229:30975,46230:30976,46231:30978,46232:30979,46233:30980,46234:30982,46235:30983,46236:30984,46237:30985,46238:30986,46239:30987,46240:30988,46241:30784,46242:20648,46243:30679,46244:25616,46245:35302,46246:22788,46247:25571,46248:24029,46249:31359,46250:26941,46251:20256,46252:33337,46253:21912,46254:20018,46255:30126,46256:31383,46257:24162,46258:24202,46259:38383,46260:21019,46261:21561,46262:28810,46263:25462,46264:38180,46265:22402,46266:26149,46267:26943,46268:37255,46269:21767,46270:28147,46271:32431,46272:34850,46273:25139,46274:32496,46275:30133,46276:33576,46277:30913,46278:38604,46279:36766,46280:24904,46281:29943,46282:35789,46283:27492,46284:21050,46285:36176,46286:27425,46287:32874,46288:33905,46289:22257,46290:21254,46291:20174,46292:19995,46293:20945,46294:31895,46295:37259,46296:31751,46297:20419,46298:36479,46299:31713,46300:31388,46301:25703,46302:23828,46303:20652,46304:33030,46305:30209,46306:31929,46307:28140,46308:32736,46309:26449,46310:23384,46311:23544,46312:30923,46313:25774,46314:25619,46315:25514,46316:25387,46317:38169,46318:25645,46319:36798,46320:31572,46321:30249,46322:25171,46323:22823,46324:21574,46325:27513,46326:20643,46327:25140,46328:24102,46329:27526,46330:20195,46331:36151,46332:34955,46333:24453,46334:36910,46400:30989,46401:30990,46402:30991,46403:30992,46404:30993,46405:30994,46406:30996,46407:30997,46408:30998,46409:30999,46410:31000,46411:31001,46412:31002,46413:31003,46414:31004,46415:31005,46416:31007,46417:31008,46418:31009,46419:31010,46420:31011,46421:31013,46422:31014,46423:31015,46424:31016,46425:31017,46426:31018,46427:31019,46428:31020,46429:31021,46430:31022,46431:31023,46432:31024,46433:31025,46434:31026,46435:31027,46436:31029,46437:31030,46438:31031,46439:31032,46440:31033,46441:31037,46442:31039,46443:31042,46444:31043,46445:31044,46446:31045,46447:31047,46448:31050,46449:31051,46450:31052,46451:31053,46452:31054,46453:31055,46454:31056,46455:31057,46456:31058,46457:31060,46458:31061,46459:31064,46460:31065,46461:31073,46462:31075,46464:31076,46465:31078,46466:31081,46467:31082,46468:31083,46469:31084,46470:31086,46471:31088,46472:31089,46473:31090,46474:31091,46475:31092,46476:31093,46477:31094,46478:31097,46479:31099,46480:31100,46481:31101,46482:31102,46483:31103,46484:31106,46485:31107,46486:31110,46487:31111,46488:31112,46489:31113,46490:31115,46491:31116,46492:31117,46493:31118,46494:31120,46495:31121,46496:31122,46497:24608,46498:32829,46499:25285,46500:20025,46501:21333,46502:37112,46503:25528,46504:32966,46505:26086,46506:27694,46507:20294,46508:24814,46509:28129,46510:35806,46511:24377,46512:34507,46513:24403,46514:25377,46515:20826,46516:33633,46517:26723,46518:20992,46519:25443,46520:36424,46521:20498,46522:23707,46523:31095,46524:23548,46525:21040,46526:31291,46527:24764,46528:36947,46529:30423,46530:24503,46531:24471,46532:30340,46533:36460,46534:28783,46535:30331,46536:31561,46537:30634,46538:20979,46539:37011,46540:22564,46541:20302,46542:28404,46543:36842,46544:25932,46545:31515,46546:29380,46547:28068,46548:32735,46549:23265,46550:25269,46551:24213,46552:22320,46553:33922,46554:31532,46555:24093,46556:24351,46557:36882,46558:32532,46559:39072,46560:25474,46561:28359,46562:30872,46563:28857,46564:20856,46565:38747,46566:22443,46567:30005,46568:20291,46569:30008,46570:24215,46571:24806,46572:22880,46573:28096,46574:27583,46575:30857,46576:21500,46577:38613,46578:20939,46579:20993,46580:25481,46581:21514,46582:38035,46583:35843,46584:36300,46585:29241,46586:30879,46587:34678,46588:36845,46589:35853,46590:21472,46656:31123,46657:31124,46658:31125,46659:31126,46660:31127,46661:31128,46662:31129,46663:31131,46664:31132,46665:31133,46666:31134,46667:31135,46668:31136,46669:31137,46670:31138,46671:31139,46672:31140,46673:31141,46674:31142,46675:31144,46676:31145,46677:31146,46678:31147,46679:31148,46680:31149,46681:31150,46682:31151,46683:31152,46684:31153,46685:31154,46686:31156,46687:31157,46688:31158,46689:31159,46690:31160,46691:31164,46692:31167,46693:31170,46694:31172,46695:31173,46696:31175,46697:31176,46698:31178,46699:31180,46700:31182,46701:31183,46702:31184,46703:31187,46704:31188,46705:31190,46706:31191,46707:31193,46708:31194,46709:31195,46710:31196,46711:31197,46712:31198,46713:31200,46714:31201,46715:31202,46716:31205,46717:31208,46718:31210,46720:31212,46721:31214,46722:31217,46723:31218,46724:31219,46725:31220,46726:31221,46727:31222,46728:31223,46729:31225,46730:31226,46731:31228,46732:31230,46733:31231,46734:31233,46735:31236,46736:31237,46737:31239,46738:31240,46739:31241,46740:31242,46741:31244,46742:31247,46743:31248,46744:31249,46745:31250,46746:31251,46747:31253,46748:31254,46749:31256,46750:31257,46751:31259,46752:31260,46753:19969,46754:30447,46755:21486,46756:38025,46757:39030,46758:40718,46759:38189,46760:23450,46761:35746,46762:20002,46763:19996,46764:20908,46765:33891,46766:25026,46767:21160,46768:26635,46769:20375,46770:24683,46771:20923,46772:27934,46773:20828,46774:25238,46775:26007,46776:38497,46777:35910,46778:36887,46779:30168,46780:37117,46781:30563,46782:27602,46783:29322,46784:29420,46785:35835,46786:22581,46787:30585,46788:36172,46789:26460,46790:38208,46791:32922,46792:24230,46793:28193,46794:22930,46795:31471,46796:30701,46797:38203,46798:27573,46799:26029,46800:32526,46801:22534,46802:20817,46803:38431,46804:23545,46805:22697,46806:21544,46807:36466,46808:25958,46809:39039,46810:22244,46811:38045,46812:30462,46813:36929,46814:25479,46815:21702,46816:22810,46817:22842,46818:22427,46819:36530,46820:26421,46821:36346,46822:33333,46823:21057,46824:24816,46825:22549,46826:34558,46827:23784,46828:40517,46829:20420,46830:39069,46831:35769,46832:23077,46833:24694,46834:21380,46835:25212,46836:36943,46837:37122,46838:39295,46839:24681,46840:32780,46841:20799,46842:32819,46843:23572,46844:39285,46845:27953,46846:20108,46912:31261,46913:31263,46914:31265,46915:31266,46916:31268,46917:31269,46918:31270,46919:31271,46920:31272,46921:31273,46922:31274,46923:31275,46924:31276,46925:31277,46926:31278,46927:31279,46928:31280,46929:31281,46930:31282,46931:31284,46932:31285,46933:31286,46934:31288,46935:31290,46936:31294,46937:31296,46938:31297,46939:31298,46940:31299,46941:31300,46942:31301,46943:31303,46944:31304,46945:31305,46946:31306,46947:31307,46948:31308,46949:31309,46950:31310,46951:31311,46952:31312,46953:31314,46954:31315,46955:31316,46956:31317,46957:31318,46958:31320,46959:31321,46960:31322,46961:31323,46962:31324,46963:31325,46964:31326,46965:31327,46966:31328,46967:31329,46968:31330,46969:31331,46970:31332,46971:31333,46972:31334,46973:31335,46974:31336,46976:31337,46977:31338,46978:31339,46979:31340,46980:31341,46981:31342,46982:31343,46983:31345,46984:31346,46985:31347,46986:31349,46987:31355,46988:31356,46989:31357,46990:31358,46991:31362,46992:31365,46993:31367,46994:31369,46995:31370,46996:31371,46997:31372,46998:31374,46999:31375,47000:31376,47001:31379,47002:31380,47003:31385,47004:31386,47005:31387,47006:31390,47007:31393,47008:31394,47009:36144,47010:21457,47011:32602,47012:31567,47013:20240,47014:20047,47015:38400,47016:27861,47017:29648,47018:34281,47019:24070,47020:30058,47021:32763,47022:27146,47023:30718,47024:38034,47025:32321,47026:20961,47027:28902,47028:21453,47029:36820,47030:33539,47031:36137,47032:29359,47033:39277,47034:27867,47035:22346,47036:33459,47037:26041,47038:32938,47039:25151,47040:38450,47041:22952,47042:20223,47043:35775,47044:32442,47045:25918,47046:33778,47047:38750,47048:21857,47049:39134,47050:32933,47051:21290,47052:35837,47053:21536,47054:32954,47055:24223,47056:27832,47057:36153,47058:33452,47059:37210,47060:21545,47061:27675,47062:20998,47063:32439,47064:22367,47065:28954,47066:27774,47067:31881,47068:22859,47069:20221,47070:24575,47071:24868,47072:31914,47073:20016,47074:23553,47075:26539,47076:34562,47077:23792,47078:38155,47079:39118,47080:30127,47081:28925,47082:36898,47083:20911,47084:32541,47085:35773,47086:22857,47087:20964,47088:20315,47089:21542,47090:22827,47091:25975,47092:32932,47093:23413,47094:25206,47095:25282,47096:36752,47097:24133,47098:27679,47099:31526,47100:20239,47101:20440,47102:26381,47168:31395,47169:31396,47170:31399,47171:31401,47172:31402,47173:31403,47174:31406,47175:31407,47176:31408,47177:31409,47178:31410,47179:31412,47180:31413,47181:31414,47182:31415,47183:31416,47184:31417,47185:31418,47186:31419,47187:31420,47188:31421,47189:31422,47190:31424,47191:31425,47192:31426,47193:31427,47194:31428,47195:31429,47196:31430,47197:31431,47198:31432,47199:31433,47200:31434,47201:31436,47202:31437,47203:31438,47204:31439,47205:31440,47206:31441,47207:31442,47208:31443,47209:31444,47210:31445,47211:31447,47212:31448,47213:31450,47214:31451,47215:31452,47216:31453,47217:31457,47218:31458,47219:31460,47220:31463,47221:31464,47222:31465,47223:31466,47224:31467,47225:31468,47226:31470,47227:31472,47228:31473,47229:31474,47230:31475,47232:31476,47233:31477,47234:31478,47235:31479,47236:31480,47237:31483,47238:31484,47239:31486,47240:31488,47241:31489,47242:31490,47243:31493,47244:31495,47245:31497,47246:31500,47247:31501,47248:31502,47249:31504,47250:31506,47251:31507,47252:31510,47253:31511,47254:31512,47255:31514,47256:31516,47257:31517,47258:31519,47259:31521,47260:31522,47261:31523,47262:31527,47263:31529,47264:31533,47265:28014,47266:28074,47267:31119,47268:34993,47269:24343,47270:29995,47271:25242,47272:36741,47273:20463,47274:37340,47275:26023,47276:33071,47277:33105,47278:24220,47279:33104,47280:36212,47281:21103,47282:35206,47283:36171,47284:22797,47285:20613,47286:20184,47287:38428,47288:29238,47289:33145,47290:36127,47291:23500,47292:35747,47293:38468,47294:22919,47295:32538,47296:21648,47297:22134,47298:22030,47299:35813,47300:25913,47301:27010,47302:38041,47303:30422,47304:28297,47305:24178,47306:29976,47307:26438,47308:26577,47309:31487,47310:32925,47311:36214,47312:24863,47313:31174,47314:25954,47315:36195,47316:20872,47317:21018,47318:38050,47319:32568,47320:32923,47321:32434,47322:23703,47323:28207,47324:26464,47325:31705,47326:30347,47327:39640,47328:33167,47329:32660,47330:31957,47331:25630,47332:38224,47333:31295,47334:21578,47335:21733,47336:27468,47337:25601,47338:25096,47339:40509,47340:33011,47341:30105,47342:21106,47343:38761,47344:33883,47345:26684,47346:34532,47347:38401,47348:38548,47349:38124,47350:20010,47351:21508,47352:32473,47353:26681,47354:36319,47355:32789,47356:26356,47357:24218,47358:32697,47424:31535,47425:31536,47426:31538,47427:31540,47428:31541,47429:31542,47430:31543,47431:31545,47432:31547,47433:31549,47434:31551,47435:31552,47436:31553,47437:31554,47438:31555,47439:31556,47440:31558,47441:31560,47442:31562,47443:31565,47444:31566,47445:31571,47446:31573,47447:31575,47448:31577,47449:31580,47450:31582,47451:31583,47452:31585,47453:31587,47454:31588,47455:31589,47456:31590,47457:31591,47458:31592,47459:31593,47460:31594,47461:31595,47462:31596,47463:31597,47464:31599,47465:31600,47466:31603,47467:31604,47468:31606,47469:31608,47470:31610,47471:31612,47472:31613,47473:31615,47474:31617,47475:31618,47476:31619,47477:31620,47478:31622,47479:31623,47480:31624,47481:31625,47482:31626,47483:31627,47484:31628,47485:31630,47486:31631,47488:31633,47489:31634,47490:31635,47491:31638,47492:31640,47493:31641,47494:31642,47495:31643,47496:31646,47497:31647,47498:31648,47499:31651,47500:31652,47501:31653,47502:31662,47503:31663,47504:31664,47505:31666,47506:31667,47507:31669,47508:31670,47509:31671,47510:31673,47511:31674,47512:31675,47513:31676,47514:31677,47515:31678,47516:31679,47517:31680,47518:31682,47519:31683,47520:31684,47521:22466,47522:32831,47523:26775,47524:24037,47525:25915,47526:21151,47527:24685,47528:40858,47529:20379,47530:36524,47531:20844,47532:23467,47533:24339,47534:24041,47535:27742,47536:25329,47537:36129,47538:20849,47539:38057,47540:21246,47541:27807,47542:33503,47543:29399,47544:22434,47545:26500,47546:36141,47547:22815,47548:36764,47549:33735,47550:21653,47551:31629,47552:20272,47553:27837,47554:23396,47555:22993,47556:40723,47557:21476,47558:34506,47559:39592,47560:35895,47561:32929,47562:25925,47563:39038,47564:22266,47565:38599,47566:21038,47567:29916,47568:21072,47569:23521,47570:25346,47571:35074,47572:20054,47573:25296,47574:24618,47575:26874,47576:20851,47577:23448,47578:20896,47579:35266,47580:31649,47581:39302,47582:32592,47583:24815,47584:28748,47585:36143,47586:20809,47587:24191,47588:36891,47589:29808,47590:35268,47591:22317,47592:30789,47593:24402,47594:40863,47595:38394,47596:36712,47597:39740,47598:35809,47599:30328,47600:26690,47601:26588,47602:36330,47603:36149,47604:21053,47605:36746,47606:28378,47607:26829,47608:38149,47609:37101,47610:22269,47611:26524,47612:35065,47613:36807,47614:21704,47680:31685,47681:31688,47682:31689,47683:31690,47684:31691,47685:31693,47686:31694,47687:31695,47688:31696,47689:31698,47690:31700,47691:31701,47692:31702,47693:31703,47694:31704,47695:31707,47696:31708,47697:31710,47698:31711,47699:31712,47700:31714,47701:31715,47702:31716,47703:31719,47704:31720,47705:31721,47706:31723,47707:31724,47708:31725,47709:31727,47710:31728,47711:31730,47712:31731,47713:31732,47714:31733,47715:31734,47716:31736,47717:31737,47718:31738,47719:31739,47720:31741,47721:31743,47722:31744,47723:31745,47724:31746,47725:31747,47726:31748,47727:31749,47728:31750,47729:31752,47730:31753,47731:31754,47732:31757,47733:31758,47734:31760,47735:31761,47736:31762,47737:31763,47738:31764,47739:31765,47740:31767,47741:31768,47742:31769,47744:31770,47745:31771,47746:31772,47747:31773,47748:31774,47749:31776,47750:31777,47751:31778,47752:31779,47753:31780,47754:31781,47755:31784,47756:31785,47757:31787,47758:31788,47759:31789,47760:31790,47761:31791,47762:31792,47763:31793,47764:31794,47765:31795,47766:31796,47767:31797,47768:31798,47769:31799,47770:31801,47771:31802,47772:31803,47773:31804,47774:31805,47775:31806,47776:31810,47777:39608,47778:23401,47779:28023,47780:27686,47781:20133,47782:23475,47783:39559,47784:37219,47785:25000,47786:37039,47787:38889,47788:21547,47789:28085,47790:23506,47791:20989,47792:21898,47793:32597,47794:32752,47795:25788,47796:25421,47797:26097,47798:25022,47799:24717,47800:28938,47801:27735,47802:27721,47803:22831,47804:26477,47805:33322,47806:22741,47807:22158,47808:35946,47809:27627,47810:37085,47811:22909,47812:32791,47813:21495,47814:28009,47815:21621,47816:21917,47817:33655,47818:33743,47819:26680,47820:31166,47821:21644,47822:20309,47823:21512,47824:30418,47825:35977,47826:38402,47827:27827,47828:28088,47829:36203,47830:35088,47831:40548,47832:36154,47833:22079,47834:40657,47835:30165,47836:24456,47837:29408,47838:24680,47839:21756,47840:20136,47841:27178,47842:34913,47843:24658,47844:36720,47845:21700,47846:28888,47847:34425,47848:40511,47849:27946,47850:23439,47851:24344,47852:32418,47853:21897,47854:20399,47855:29492,47856:21564,47857:21402,47858:20505,47859:21518,47860:21628,47861:20046,47862:24573,47863:29786,47864:22774,47865:33899,47866:32993,47867:34676,47868:29392,47869:31946,47870:28246,47936:31811,47937:31812,47938:31813,47939:31814,47940:31815,47941:31816,47942:31817,47943:31818,47944:31819,47945:31820,47946:31822,47947:31823,47948:31824,47949:31825,47950:31826,47951:31827,47952:31828,47953:31829,47954:31830,47955:31831,47956:31832,47957:31833,47958:31834,47959:31835,47960:31836,47961:31837,47962:31838,47963:31839,47964:31840,47965:31841,47966:31842,47967:31843,47968:31844,47969:31845,47970:31846,47971:31847,47972:31848,47973:31849,47974:31850,47975:31851,47976:31852,47977:31853,47978:31854,47979:31855,47980:31856,47981:31857,47982:31858,47983:31861,47984:31862,47985:31863,47986:31864,47987:31865,47988:31866,47989:31870,47990:31871,47991:31872,47992:31873,47993:31874,47994:31875,47995:31876,47996:31877,47997:31878,47998:31879,48000:31880,48001:31882,48002:31883,48003:31884,48004:31885,48005:31886,48006:31887,48007:31888,48008:31891,48009:31892,48010:31894,48011:31897,48012:31898,48013:31899,48014:31904,48015:31905,48016:31907,48017:31910,48018:31911,48019:31912,48020:31913,48021:31915,48022:31916,48023:31917,48024:31919,48025:31920,48026:31924,48027:31925,48028:31926,48029:31927,48030:31928,48031:31930,48032:31931,48033:24359,48034:34382,48035:21804,48036:25252,48037:20114,48038:27818,48039:25143,48040:33457,48041:21719,48042:21326,48043:29502,48044:28369,48045:30011,48046:21010,48047:21270,48048:35805,48049:27088,48050:24458,48051:24576,48052:28142,48053:22351,48054:27426,48055:29615,48056:26707,48057:36824,48058:32531,48059:25442,48060:24739,48061:21796,48062:30186,48063:35938,48064:28949,48065:28067,48066:23462,48067:24187,48068:33618,48069:24908,48070:40644,48071:30970,48072:34647,48073:31783,48074:30343,48075:20976,48076:24822,48077:29004,48078:26179,48079:24140,48080:24653,48081:35854,48082:28784,48083:25381,48084:36745,48085:24509,48086:24674,48087:34516,48088:22238,48089:27585,48090:24724,48091:24935,48092:21321,48093:24800,48094:26214,48095:36159,48096:31229,48097:20250,48098:28905,48099:27719,48100:35763,48101:35826,48102:32472,48103:33636,48104:26127,48105:23130,48106:39746,48107:27985,48108:28151,48109:35905,48110:27963,48111:20249,48112:28779,48113:33719,48114:25110,48115:24785,48116:38669,48117:36135,48118:31096,48119:20987,48120:22334,48121:22522,48122:26426,48123:30072,48124:31293,48125:31215,48126:31637,48192:31935,48193:31936,48194:31938,48195:31939,48196:31940,48197:31942,48198:31945,48199:31947,48200:31950,48201:31951,48202:31952,48203:31953,48204:31954,48205:31955,48206:31956,48207:31960,48208:31962,48209:31963,48210:31965,48211:31966,48212:31969,48213:31970,48214:31971,48215:31972,48216:31973,48217:31974,48218:31975,48219:31977,48220:31978,48221:31979,48222:31980,48223:31981,48224:31982,48225:31984,48226:31985,48227:31986,48228:31987,48229:31988,48230:31989,48231:31990,48232:31991,48233:31993,48234:31994,48235:31996,48236:31997,48237:31998,48238:31999,48239:32000,48240:32001,48241:32002,48242:32003,48243:32004,48244:32005,48245:32006,48246:32007,48247:32008,48248:32009,48249:32011,48250:32012,48251:32013,48252:32014,48253:32015,48254:32016,48256:32017,48257:32018,48258:32019,48259:32020,48260:32021,48261:32022,48262:32023,48263:32024,48264:32025,48265:32026,48266:32027,48267:32028,48268:32029,48269:32030,48270:32031,48271:32033,48272:32035,48273:32036,48274:32037,48275:32038,48276:32040,48277:32041,48278:32042,48279:32044,48280:32045,48281:32046,48282:32048,48283:32049,48284:32050,48285:32051,48286:32052,48287:32053,48288:32054,48289:32908,48290:39269,48291:36857,48292:28608,48293:35749,48294:40481,48295:23020,48296:32489,48297:32521,48298:21513,48299:26497,48300:26840,48301:36753,48302:31821,48303:38598,48304:21450,48305:24613,48306:30142,48307:27762,48308:21363,48309:23241,48310:32423,48311:25380,48312:20960,48313:33034,48314:24049,48315:34015,48316:25216,48317:20864,48318:23395,48319:20238,48320:31085,48321:21058,48322:24760,48323:27982,48324:23492,48325:23490,48326:35745,48327:35760,48328:26082,48329:24524,48330:38469,48331:22931,48332:32487,48333:32426,48334:22025,48335:26551,48336:22841,48337:20339,48338:23478,48339:21152,48340:33626,48341:39050,48342:36158,48343:30002,48344:38078,48345:20551,48346:31292,48347:20215,48348:26550,48349:39550,48350:23233,48351:27516,48352:30417,48353:22362,48354:23574,48355:31546,48356:38388,48357:29006,48358:20860,48359:32937,48360:33392,48361:22904,48362:32516,48363:33575,48364:26816,48365:26604,48366:30897,48367:30839,48368:25315,48369:25441,48370:31616,48371:20461,48372:21098,48373:20943,48374:33616,48375:27099,48376:37492,48377:36341,48378:36145,48379:35265,48380:38190,48381:31661,48382:20214,48448:32055,48449:32056,48450:32057,48451:32058,48452:32059,48453:32060,48454:32061,48455:32062,48456:32063,48457:32064,48458:32065,48459:32066,48460:32067,48461:32068,48462:32069,48463:32070,48464:32071,48465:32072,48466:32073,48467:32074,48468:32075,48469:32076,48470:32077,48471:32078,48472:32079,48473:32080,48474:32081,48475:32082,48476:32083,48477:32084,48478:32085,48479:32086,48480:32087,48481:32088,48482:32089,48483:32090,48484:32091,48485:32092,48486:32093,48487:32094,48488:32095,48489:32096,48490:32097,48491:32098,48492:32099,48493:32100,48494:32101,48495:32102,48496:32103,48497:32104,48498:32105,48499:32106,48500:32107,48501:32108,48502:32109,48503:32111,48504:32112,48505:32113,48506:32114,48507:32115,48508:32116,48509:32117,48510:32118,48512:32120,48513:32121,48514:32122,48515:32123,48516:32124,48517:32125,48518:32126,48519:32127,48520:32128,48521:32129,48522:32130,48523:32131,48524:32132,48525:32133,48526:32134,48527:32135,48528:32136,48529:32137,48530:32138,48531:32139,48532:32140,48533:32141,48534:32142,48535:32143,48536:32144,48537:32145,48538:32146,48539:32147,48540:32148,48541:32149,48542:32150,48543:32151,48544:32152,48545:20581,48546:33328,48547:21073,48548:39279,48549:28176,48550:28293,48551:28071,48552:24314,48553:20725,48554:23004,48555:23558,48556:27974,48557:27743,48558:30086,48559:33931,48560:26728,48561:22870,48562:35762,48563:21280,48564:37233,48565:38477,48566:34121,48567:26898,48568:30977,48569:28966,48570:33014,48571:20132,48572:37066,48573:27975,48574:39556,48575:23047,48576:22204,48577:25605,48578:38128,48579:30699,48580:20389,48581:33050,48582:29409,48583:35282,48584:39290,48585:32564,48586:32478,48587:21119,48588:25945,48589:37237,48590:36735,48591:36739,48592:21483,48593:31382,48594:25581,48595:25509,48596:30342,48597:31224,48598:34903,48599:38454,48600:25130,48601:21163,48602:33410,48603:26708,48604:26480,48605:25463,48606:30571,48607:31469,48608:27905,48609:32467,48610:35299,48611:22992,48612:25106,48613:34249,48614:33445,48615:30028,48616:20511,48617:20171,48618:30117,48619:35819,48620:23626,48621:24062,48622:31563,48623:26020,48624:37329,48625:20170,48626:27941,48627:35167,48628:32039,48629:38182,48630:20165,48631:35880,48632:36827,48633:38771,48634:26187,48635:31105,48636:36817,48637:28908,48638:28024,48704:32153,48705:32154,48706:32155,48707:32156,48708:32157,48709:32158,48710:32159,48711:32160,48712:32161,48713:32162,48714:32163,48715:32164,48716:32165,48717:32167,48718:32168,48719:32169,48720:32170,48721:32171,48722:32172,48723:32173,48724:32175,48725:32176,48726:32177,48727:32178,48728:32179,48729:32180,48730:32181,48731:32182,48732:32183,48733:32184,48734:32185,48735:32186,48736:32187,48737:32188,48738:32189,48739:32190,48740:32191,48741:32192,48742:32193,48743:32194,48744:32195,48745:32196,48746:32197,48747:32198,48748:32199,48749:32200,48750:32201,48751:32202,48752:32203,48753:32204,48754:32205,48755:32206,48756:32207,48757:32208,48758:32209,48759:32210,48760:32211,48761:32212,48762:32213,48763:32214,48764:32215,48765:32216,48766:32217,48768:32218,48769:32219,48770:32220,48771:32221,48772:32222,48773:32223,48774:32224,48775:32225,48776:32226,48777:32227,48778:32228,48779:32229,48780:32230,48781:32231,48782:32232,48783:32233,48784:32234,48785:32235,48786:32236,48787:32237,48788:32238,48789:32239,48790:32240,48791:32241,48792:32242,48793:32243,48794:32244,48795:32245,48796:32246,48797:32247,48798:32248,48799:32249,48800:32250,48801:23613,48802:21170,48803:33606,48804:20834,48805:33550,48806:30555,48807:26230,48808:40120,48809:20140,48810:24778,48811:31934,48812:31923,48813:32463,48814:20117,48815:35686,48816:26223,48817:39048,48818:38745,48819:22659,48820:25964,48821:38236,48822:24452,48823:30153,48824:38742,48825:31455,48826:31454,48827:20928,48828:28847,48829:31384,48830:25578,48831:31350,48832:32416,48833:29590,48834:38893,48835:20037,48836:28792,48837:20061,48838:37202,48839:21417,48840:25937,48841:26087,48842:33276,48843:33285,48844:21646,48845:23601,48846:30106,48847:38816,48848:25304,48849:29401,48850:30141,48851:23621,48852:39545,48853:33738,48854:23616,48855:21632,48856:30697,48857:20030,48858:27822,48859:32858,48860:25298,48861:25454,48862:24040,48863:20855,48864:36317,48865:36382,48866:38191,48867:20465,48868:21477,48869:24807,48870:28844,48871:21095,48872:25424,48873:40515,48874:23071,48875:20518,48876:30519,48877:21367,48878:32482,48879:25733,48880:25899,48881:25225,48882:25496,48883:20500,48884:29237,48885:35273,48886:20915,48887:35776,48888:32477,48889:22343,48890:33740,48891:38055,48892:20891,48893:21531,48894:23803,48960:32251,48961:32252,48962:32253,48963:32254,48964:32255,48965:32256,48966:32257,48967:32258,48968:32259,48969:32260,48970:32261,48971:32262,48972:32263,48973:32264,48974:32265,48975:32266,48976:32267,48977:32268,48978:32269,48979:32270,48980:32271,48981:32272,48982:32273,48983:32274,48984:32275,48985:32276,48986:32277,48987:32278,48988:32279,48989:32280,48990:32281,48991:32282,48992:32283,48993:32284,48994:32285,48995:32286,48996:32287,48997:32288,48998:32289,48999:32290,49000:32291,49001:32292,49002:32293,49003:32294,49004:32295,49005:32296,49006:32297,49007:32298,49008:32299,49009:32300,49010:32301,49011:32302,49012:32303,49013:32304,49014:32305,49015:32306,49016:32307,49017:32308,49018:32309,49019:32310,49020:32311,49021:32312,49022:32313,49024:32314,49025:32316,49026:32317,49027:32318,49028:32319,49029:32320,49030:32322,49031:32323,49032:32324,49033:32325,49034:32326,49035:32328,49036:32329,49037:32330,49038:32331,49039:32332,49040:32333,49041:32334,49042:32335,49043:32336,49044:32337,49045:32338,49046:32339,49047:32340,49048:32341,49049:32342,49050:32343,49051:32344,49052:32345,49053:32346,49054:32347,49055:32348,49056:32349,49057:20426,49058:31459,49059:27994,49060:37089,49061:39567,49062:21888,49063:21654,49064:21345,49065:21679,49066:24320,49067:25577,49068:26999,49069:20975,49070:24936,49071:21002,49072:22570,49073:21208,49074:22350,49075:30733,49076:30475,49077:24247,49078:24951,49079:31968,49080:25179,49081:25239,49082:20130,49083:28821,49084:32771,49085:25335,49086:28900,49087:38752,49088:22391,49089:33499,49090:26607,49091:26869,49092:30933,49093:39063,49094:31185,49095:22771,49096:21683,49097:21487,49098:28212,49099:20811,49100:21051,49101:23458,49102:35838,49103:32943,49104:21827,49105:22438,49106:24691,49107:22353,49108:21549,49109:31354,49110:24656,49111:23380,49112:25511,49113:25248,49114:21475,49115:25187,49116:23495,49117:26543,49118:21741,49119:31391,49120:33510,49121:37239,49122:24211,49123:35044,49124:22840,49125:22446,49126:25358,49127:36328,49128:33007,49129:22359,49130:31607,49131:20393,49132:24555,49133:23485,49134:27454,49135:21281,49136:31568,49137:29378,49138:26694,49139:30719,49140:30518,49141:26103,49142:20917,49143:20111,49144:30420,49145:23743,49146:31397,49147:33909,49148:22862,49149:39745,49150:20608,49216:32350,49217:32351,49218:32352,49219:32353,49220:32354,49221:32355,49222:32356,49223:32357,49224:32358,49225:32359,49226:32360,49227:32361,49228:32362,49229:32363,49230:32364,49231:32365,49232:32366,49233:32367,49234:32368,49235:32369,49236:32370,49237:32371,49238:32372,49239:32373,49240:32374,49241:32375,49242:32376,49243:32377,49244:32378,49245:32379,49246:32380,49247:32381,49248:32382,49249:32383,49250:32384,49251:32385,49252:32387,49253:32388,49254:32389,49255:32390,49256:32391,49257:32392,49258:32393,49259:32394,49260:32395,49261:32396,49262:32397,49263:32398,49264:32399,49265:32400,49266:32401,49267:32402,49268:32403,49269:32404,49270:32405,49271:32406,49272:32407,49273:32408,49274:32409,49275:32410,49276:32412,49277:32413,49278:32414,49280:32430,49281:32436,49282:32443,49283:32444,49284:32470,49285:32484,49286:32492,49287:32505,49288:32522,49289:32528,49290:32542,49291:32567,49292:32569,49293:32571,49294:32572,49295:32573,49296:32574,49297:32575,49298:32576,49299:32577,49300:32579,49301:32582,49302:32583,49303:32584,49304:32585,49305:32586,49306:32587,49307:32588,49308:32589,49309:32590,49310:32591,49311:32594,49312:32595,49313:39304,49314:24871,49315:28291,49316:22372,49317:26118,49318:25414,49319:22256,49320:25324,49321:25193,49322:24275,49323:38420,49324:22403,49325:25289,49326:21895,49327:34593,49328:33098,49329:36771,49330:21862,49331:33713,49332:26469,49333:36182,49334:34013,49335:23146,49336:26639,49337:25318,49338:31726,49339:38417,49340:20848,49341:28572,49342:35888,49343:25597,49344:35272,49345:25042,49346:32518,49347:28866,49348:28389,49349:29701,49350:27028,49351:29436,49352:24266,49353:37070,49354:26391,49355:28010,49356:25438,49357:21171,49358:29282,49359:32769,49360:20332,49361:23013,49362:37226,49363:28889,49364:28061,49365:21202,49366:20048,49367:38647,49368:38253,49369:34174,49370:30922,49371:32047,49372:20769,49373:22418,49374:25794,49375:32907,49376:31867,49377:27882,49378:26865,49379:26974,49380:20919,49381:21400,49382:26792,49383:29313,49384:40654,49385:31729,49386:29432,49387:31163,49388:28435,49389:29702,49390:26446,49391:37324,49392:40100,49393:31036,49394:33673,49395:33620,49396:21519,49397:26647,49398:20029,49399:21385,49400:21169,49401:30782,49402:21382,49403:21033,49404:20616,49405:20363,49406:20432,49472:32598,49473:32601,49474:32603,49475:32604,49476:32605,49477:32606,49478:32608,49479:32611,49480:32612,49481:32613,49482:32614,49483:32615,49484:32619,49485:32620,49486:32621,49487:32623,49488:32624,49489:32627,49490:32629,49491:32630,49492:32631,49493:32632,49494:32634,49495:32635,49496:32636,49497:32637,49498:32639,49499:32640,49500:32642,49501:32643,49502:32644,49503:32645,49504:32646,49505:32647,49506:32648,49507:32649,49508:32651,49509:32653,49510:32655,49511:32656,49512:32657,49513:32658,49514:32659,49515:32661,49516:32662,49517:32663,49518:32664,49519:32665,49520:32667,49521:32668,49522:32672,49523:32674,49524:32675,49525:32677,49526:32678,49527:32680,49528:32681,49529:32682,49530:32683,49531:32684,49532:32685,49533:32686,49534:32689,49536:32691,49537:32692,49538:32693,49539:32694,49540:32695,49541:32698,49542:32699,49543:32702,49544:32704,49545:32706,49546:32707,49547:32708,49548:32710,49549:32711,49550:32712,49551:32713,49552:32715,49553:32717,49554:32719,49555:32720,49556:32721,49557:32722,49558:32723,49559:32726,49560:32727,49561:32729,49562:32730,49563:32731,49564:32732,49565:32733,49566:32734,49567:32738,49568:32739,49569:30178,49570:31435,49571:31890,49572:27813,49573:38582,49574:21147,49575:29827,49576:21737,49577:20457,49578:32852,49579:33714,49580:36830,49581:38256,49582:24265,49583:24604,49584:28063,49585:24088,49586:25947,49587:33080,49588:38142,49589:24651,49590:28860,49591:32451,49592:31918,49593:20937,49594:26753,49595:31921,49596:33391,49597:20004,49598:36742,49599:37327,49600:26238,49601:20142,49602:35845,49603:25769,49604:32842,49605:20698,49606:30103,49607:29134,49608:23525,49609:36797,49610:28518,49611:20102,49612:25730,49613:38243,49614:24278,49615:26009,49616:21015,49617:35010,49618:28872,49619:21155,49620:29454,49621:29747,49622:26519,49623:30967,49624:38678,49625:20020,49626:37051,49627:40158,49628:28107,49629:20955,49630:36161,49631:21533,49632:25294,49633:29618,49634:33777,49635:38646,49636:40836,49637:38083,49638:20278,49639:32666,49640:20940,49641:28789,49642:38517,49643:23725,49644:39046,49645:21478,49646:20196,49647:28316,49648:29705,49649:27060,49650:30827,49651:39311,49652:30041,49653:21016,49654:30244,49655:27969,49656:26611,49657:20845,49658:40857,49659:32843,49660:21657,49661:31548,49662:31423,49728:32740,49729:32743,49730:32744,49731:32746,49732:32747,49733:32748,49734:32749,49735:32751,49736:32754,49737:32756,49738:32757,49739:32758,49740:32759,49741:32760,49742:32761,49743:32762,49744:32765,49745:32766,49746:32767,49747:32770,49748:32775,49749:32776,49750:32777,49751:32778,49752:32782,49753:32783,49754:32785,49755:32787,49756:32794,49757:32795,49758:32797,49759:32798,49760:32799,49761:32801,49762:32803,49763:32804,49764:32811,49765:32812,49766:32813,49767:32814,49768:32815,49769:32816,49770:32818,49771:32820,49772:32825,49773:32826,49774:32828,49775:32830,49776:32832,49777:32833,49778:32836,49779:32837,49780:32839,49781:32840,49782:32841,49783:32846,49784:32847,49785:32848,49786:32849,49787:32851,49788:32853,49789:32854,49790:32855,49792:32857,49793:32859,49794:32860,49795:32861,49796:32862,49797:32863,49798:32864,49799:32865,49800:32866,49801:32867,49802:32868,49803:32869,49804:32870,49805:32871,49806:32872,49807:32875,49808:32876,49809:32877,49810:32878,49811:32879,49812:32880,49813:32882,49814:32883,49815:32884,49816:32885,49817:32886,49818:32887,49819:32888,49820:32889,49821:32890,49822:32891,49823:32892,49824:32893,49825:38534,49826:22404,49827:25314,49828:38471,49829:27004,49830:23044,49831:25602,49832:31699,49833:28431,49834:38475,49835:33446,49836:21346,49837:39045,49838:24208,49839:28809,49840:25523,49841:21348,49842:34383,49843:40065,49844:40595,49845:30860,49846:38706,49847:36335,49848:36162,49849:40575,49850:28510,49851:31108,49852:24405,49853:38470,49854:25134,49855:39540,49856:21525,49857:38109,49858:20387,49859:26053,49860:23653,49861:23649,49862:32533,49863:34385,49864:27695,49865:24459,49866:29575,49867:28388,49868:32511,49869:23782,49870:25371,49871:23402,49872:28390,49873:21365,49874:20081,49875:25504,49876:30053,49877:25249,49878:36718,49879:20262,49880:20177,49881:27814,49882:32438,49883:35770,49884:33821,49885:34746,49886:32599,49887:36923,49888:38179,49889:31657,49890:39585,49891:35064,49892:33853,49893:27931,49894:39558,49895:32476,49896:22920,49897:40635,49898:29595,49899:30721,49900:34434,49901:39532,49902:39554,49903:22043,49904:21527,49905:22475,49906:20080,49907:40614,49908:21334,49909:36808,49910:33033,49911:30610,49912:39314,49913:34542,49914:28385,49915:34067,49916:26364,49917:24930,49918:28459,49984:32894,49985:32897,49986:32898,49987:32901,49988:32904,49989:32906,49990:32909,49991:32910,49992:32911,49993:32912,49994:32913,49995:32914,49996:32916,49997:32917,49998:32919,49999:32921,50000:32926,50001:32931,50002:32934,50003:32935,50004:32936,50005:32940,50006:32944,50007:32947,50008:32949,50009:32950,50010:32952,50011:32953,50012:32955,50013:32965,50014:32967,50015:32968,50016:32969,50017:32970,50018:32971,50019:32975,50020:32976,50021:32977,50022:32978,50023:32979,50024:32980,50025:32981,50026:32984,50027:32991,50028:32992,50029:32994,50030:32995,50031:32998,50032:33006,50033:33013,50034:33015,50035:33017,50036:33019,50037:33022,50038:33023,50039:33024,50040:33025,50041:33027,50042:33028,50043:33029,50044:33031,50045:33032,50046:33035,50048:33036,50049:33045,50050:33047,50051:33049,50052:33051,50053:33052,50054:33053,50055:33055,50056:33056,50057:33057,50058:33058,50059:33059,50060:33060,50061:33061,50062:33062,50063:33063,50064:33064,50065:33065,50066:33066,50067:33067,50068:33069,50069:33070,50070:33072,50071:33075,50072:33076,50073:33077,50074:33079,50075:33081,50076:33082,50077:33083,50078:33084,50079:33085,50080:33087,50081:35881,50082:33426,50083:33579,50084:30450,50085:27667,50086:24537,50087:33725,50088:29483,50089:33541,50090:38170,50091:27611,50092:30683,50093:38086,50094:21359,50095:33538,50096:20882,50097:24125,50098:35980,50099:36152,50100:20040,50101:29611,50102:26522,50103:26757,50104:37238,50105:38665,50106:29028,50107:27809,50108:30473,50109:23186,50110:38209,50111:27599,50112:32654,50113:26151,50114:23504,50115:22969,50116:23194,50117:38376,50118:38391,50119:20204,50120:33804,50121:33945,50122:27308,50123:30431,50124:38192,50125:29467,50126:26790,50127:23391,50128:30511,50129:37274,50130:38753,50131:31964,50132:36855,50133:35868,50134:24357,50135:31859,50136:31192,50137:35269,50138:27852,50139:34588,50140:23494,50141:24130,50142:26825,50143:30496,50144:32501,50145:20885,50146:20813,50147:21193,50148:23081,50149:32517,50150:38754,50151:33495,50152:25551,50153:30596,50154:34256,50155:31186,50156:28218,50157:24217,50158:22937,50159:34065,50160:28781,50161:27665,50162:25279,50163:30399,50164:25935,50165:24751,50166:38397,50167:26126,50168:34719,50169:40483,50170:38125,50171:21517,50172:21629,50173:35884,50174:25720,50240:33088,50241:33089,50242:33090,50243:33091,50244:33092,50245:33093,50246:33095,50247:33097,50248:33101,50249:33102,50250:33103,50251:33106,50252:33110,50253:33111,50254:33112,50255:33115,50256:33116,50257:33117,50258:33118,50259:33119,50260:33121,50261:33122,50262:33123,50263:33124,50264:33126,50265:33128,50266:33130,50267:33131,50268:33132,50269:33135,50270:33138,50271:33139,50272:33141,50273:33142,50274:33143,50275:33144,50276:33153,50277:33155,50278:33156,50279:33157,50280:33158,50281:33159,50282:33161,50283:33163,50284:33164,50285:33165,50286:33166,50287:33168,50288:33170,50289:33171,50290:33172,50291:33173,50292:33174,50293:33175,50294:33177,50295:33178,50296:33182,50297:33183,50298:33184,50299:33185,50300:33186,50301:33188,50302:33189,50304:33191,50305:33193,50306:33195,50307:33196,50308:33197,50309:33198,50310:33199,50311:33200,50312:33201,50313:33202,50314:33204,50315:33205,50316:33206,50317:33207,50318:33208,50319:33209,50320:33212,50321:33213,50322:33214,50323:33215,50324:33220,50325:33221,50326:33223,50327:33224,50328:33225,50329:33227,50330:33229,50331:33230,50332:33231,50333:33232,50334:33233,50335:33234,50336:33235,50337:25721,50338:34321,50339:27169,50340:33180,50341:30952,50342:25705,50343:39764,50344:25273,50345:26411,50346:33707,50347:22696,50348:40664,50349:27819,50350:28448,50351:23518,50352:38476,50353:35851,50354:29279,50355:26576,50356:25287,50357:29281,50358:20137,50359:22982,50360:27597,50361:22675,50362:26286,50363:24149,50364:21215,50365:24917,50366:26408,50367:30446,50368:30566,50369:29287,50370:31302,50371:25343,50372:21738,50373:21584,50374:38048,50375:37027,50376:23068,50377:32435,50378:27670,50379:20035,50380:22902,50381:32784,50382:22856,50383:21335,50384:30007,50385:38590,50386:22218,50387:25376,50388:33041,50389:24700,50390:38393,50391:28118,50392:21602,50393:39297,50394:20869,50395:23273,50396:33021,50397:22958,50398:38675,50399:20522,50400:27877,50401:23612,50402:25311,50403:20320,50404:21311,50405:33147,50406:36870,50407:28346,50408:34091,50409:25288,50410:24180,50411:30910,50412:25781,50413:25467,50414:24565,50415:23064,50416:37247,50417:40479,50418:23615,50419:25423,50420:32834,50421:23421,50422:21870,50423:38218,50424:38221,50425:28037,50426:24744,50427:26592,50428:29406,50429:20957,50430:23425,50496:33236,50497:33237,50498:33238,50499:33239,50500:33240,50501:33241,50502:33242,50503:33243,50504:33244,50505:33245,50506:33246,50507:33247,50508:33248,50509:33249,50510:33250,50511:33252,50512:33253,50513:33254,50514:33256,50515:33257,50516:33259,50517:33262,50518:33263,50519:33264,50520:33265,50521:33266,50522:33269,50523:33270,50524:33271,50525:33272,50526:33273,50527:33274,50528:33277,50529:33279,50530:33283,50531:33287,50532:33288,50533:33289,50534:33290,50535:33291,50536:33294,50537:33295,50538:33297,50539:33299,50540:33301,50541:33302,50542:33303,50543:33304,50544:33305,50545:33306,50546:33309,50547:33312,50548:33316,50549:33317,50550:33318,50551:33319,50552:33321,50553:33326,50554:33330,50555:33338,50556:33340,50557:33341,50558:33343,50560:33344,50561:33345,50562:33346,50563:33347,50564:33349,50565:33350,50566:33352,50567:33354,50568:33356,50569:33357,50570:33358,50571:33360,50572:33361,50573:33362,50574:33363,50575:33364,50576:33365,50577:33366,50578:33367,50579:33369,50580:33371,50581:33372,50582:33373,50583:33374,50584:33376,50585:33377,50586:33378,50587:33379,50588:33380,50589:33381,50590:33382,50591:33383,50592:33385,50593:25319,50594:27870,50595:29275,50596:25197,50597:38062,50598:32445,50599:33043,50600:27987,50601:20892,50602:24324,50603:22900,50604:21162,50605:24594,50606:22899,50607:26262,50608:34384,50609:30111,50610:25386,50611:25062,50612:31983,50613:35834,50614:21734,50615:27431,50616:40485,50617:27572,50618:34261,50619:21589,50620:20598,50621:27812,50622:21866,50623:36276,50624:29228,50625:24085,50626:24597,50627:29750,50628:25293,50629:25490,50630:29260,50631:24472,50632:28227,50633:27966,50634:25856,50635:28504,50636:30424,50637:30928,50638:30460,50639:30036,50640:21028,50641:21467,50642:20051,50643:24222,50644:26049,50645:32810,50646:32982,50647:25243,50648:21638,50649:21032,50650:28846,50651:34957,50652:36305,50653:27873,50654:21624,50655:32986,50656:22521,50657:35060,50658:36180,50659:38506,50660:37197,50661:20329,50662:27803,50663:21943,50664:30406,50665:30768,50666:25256,50667:28921,50668:28558,50669:24429,50670:34028,50671:26842,50672:30844,50673:31735,50674:33192,50675:26379,50676:40527,50677:25447,50678:30896,50679:22383,50680:30738,50681:38713,50682:25209,50683:25259,50684:21128,50685:29749,50686:27607,50752:33386,50753:33387,50754:33388,50755:33389,50756:33393,50757:33397,50758:33398,50759:33399,50760:33400,50761:33403,50762:33404,50763:33408,50764:33409,50765:33411,50766:33413,50767:33414,50768:33415,50769:33417,50770:33420,50771:33424,50772:33427,50773:33428,50774:33429,50775:33430,50776:33434,50777:33435,50778:33438,50779:33440,50780:33442,50781:33443,50782:33447,50783:33458,50784:33461,50785:33462,50786:33466,50787:33467,50788:33468,50789:33471,50790:33472,50791:33474,50792:33475,50793:33477,50794:33478,50795:33481,50796:33488,50797:33494,50798:33497,50799:33498,50800:33501,50801:33506,50802:33511,50803:33512,50804:33513,50805:33514,50806:33516,50807:33517,50808:33518,50809:33520,50810:33522,50811:33523,50812:33525,50813:33526,50814:33528,50816:33530,50817:33532,50818:33533,50819:33534,50820:33535,50821:33536,50822:33546,50823:33547,50824:33549,50825:33552,50826:33554,50827:33555,50828:33558,50829:33560,50830:33561,50831:33565,50832:33566,50833:33567,50834:33568,50835:33569,50836:33570,50837:33571,50838:33572,50839:33573,50840:33574,50841:33577,50842:33578,50843:33582,50844:33584,50845:33586,50846:33591,50847:33595,50848:33597,50849:21860,50850:33086,50851:30130,50852:30382,50853:21305,50854:30174,50855:20731,50856:23617,50857:35692,50858:31687,50859:20559,50860:29255,50861:39575,50862:39128,50863:28418,50864:29922,50865:31080,50866:25735,50867:30629,50868:25340,50869:39057,50870:36139,50871:21697,50872:32856,50873:20050,50874:22378,50875:33529,50876:33805,50877:24179,50878:20973,50879:29942,50880:35780,50881:23631,50882:22369,50883:27900,50884:39047,50885:23110,50886:30772,50887:39748,50888:36843,50889:31893,50890:21078,50891:25169,50892:38138,50893:20166,50894:33670,50895:33889,50896:33769,50897:33970,50898:22484,50899:26420,50900:22275,50901:26222,50902:28006,50903:35889,50904:26333,50905:28689,50906:26399,50907:27450,50908:26646,50909:25114,50910:22971,50911:19971,50912:20932,50913:28422,50914:26578,50915:27791,50916:20854,50917:26827,50918:22855,50919:27495,50920:30054,50921:23822,50922:33040,50923:40784,50924:26071,50925:31048,50926:31041,50927:39569,50928:36215,50929:23682,50930:20062,50931:20225,50932:21551,50933:22865,50934:30732,50935:22120,50936:27668,50937:36804,50938:24323,50939:27773,50940:27875,50941:35755,50942:25488,51008:33598,51009:33599,51010:33601,51011:33602,51012:33604,51013:33605,51014:33608,51015:33610,51016:33611,51017:33612,51018:33613,51019:33614,51020:33619,51021:33621,51022:33622,51023:33623,51024:33624,51025:33625,51026:33629,51027:33634,51028:33648,51029:33649,51030:33650,51031:33651,51032:33652,51033:33653,51034:33654,51035:33657,51036:33658,51037:33662,51038:33663,51039:33664,51040:33665,51041:33666,51042:33667,51043:33668,51044:33671,51045:33672,51046:33674,51047:33675,51048:33676,51049:33677,51050:33679,51051:33680,51052:33681,51053:33684,51054:33685,51055:33686,51056:33687,51057:33689,51058:33690,51059:33693,51060:33695,51061:33697,51062:33698,51063:33699,51064:33700,51065:33701,51066:33702,51067:33703,51068:33708,51069:33709,51070:33710,51072:33711,51073:33717,51074:33723,51075:33726,51076:33727,51077:33730,51078:33731,51079:33732,51080:33734,51081:33736,51082:33737,51083:33739,51084:33741,51085:33742,51086:33744,51087:33745,51088:33746,51089:33747,51090:33749,51091:33751,51092:33753,51093:33754,51094:33755,51095:33758,51096:33762,51097:33763,51098:33764,51099:33766,51100:33767,51101:33768,51102:33771,51103:33772,51104:33773,51105:24688,51106:27965,51107:29301,51108:25190,51109:38030,51110:38085,51111:21315,51112:36801,51113:31614,51114:20191,51115:35878,51116:20094,51117:40660,51118:38065,51119:38067,51120:21069,51121:28508,51122:36963,51123:27973,51124:35892,51125:22545,51126:23884,51127:27424,51128:27465,51129:26538,51130:21595,51131:33108,51132:32652,51133:22681,51134:34103,51135:24378,51136:25250,51137:27207,51138:38201,51139:25970,51140:24708,51141:26725,51142:30631,51143:20052,51144:20392,51145:24039,51146:38808,51147:25772,51148:32728,51149:23789,51150:20431,51151:31373,51152:20999,51153:33540,51154:19988,51155:24623,51156:31363,51157:38054,51158:20405,51159:20146,51160:31206,51161:29748,51162:21220,51163:33465,51164:25810,51165:31165,51166:23517,51167:27777,51168:38738,51169:36731,51170:27682,51171:20542,51172:21375,51173:28165,51174:25806,51175:26228,51176:27696,51177:24773,51178:39031,51179:35831,51180:24198,51181:29756,51182:31351,51183:31179,51184:19992,51185:37041,51186:29699,51187:27714,51188:22234,51189:37195,51190:27845,51191:36235,51192:21306,51193:34502,51194:26354,51195:36527,51196:23624,51197:39537,51198:28192,51264:33774,51265:33775,51266:33779,51267:33780,51268:33781,51269:33782,51270:33783,51271:33786,51272:33787,51273:33788,51274:33790,51275:33791,51276:33792,51277:33794,51278:33797,51279:33799,51280:33800,51281:33801,51282:33802,51283:33808,51284:33810,51285:33811,51286:33812,51287:33813,51288:33814,51289:33815,51290:33817,51291:33818,51292:33819,51293:33822,51294:33823,51295:33824,51296:33825,51297:33826,51298:33827,51299:33833,51300:33834,51301:33835,51302:33836,51303:33837,51304:33838,51305:33839,51306:33840,51307:33842,51308:33843,51309:33844,51310:33845,51311:33846,51312:33847,51313:33849,51314:33850,51315:33851,51316:33854,51317:33855,51318:33856,51319:33857,51320:33858,51321:33859,51322:33860,51323:33861,51324:33863,51325:33864,51326:33865,51328:33866,51329:33867,51330:33868,51331:33869,51332:33870,51333:33871,51334:33872,51335:33874,51336:33875,51337:33876,51338:33877,51339:33878,51340:33880,51341:33885,51342:33886,51343:33887,51344:33888,51345:33890,51346:33892,51347:33893,51348:33894,51349:33895,51350:33896,51351:33898,51352:33902,51353:33903,51354:33904,51355:33906,51356:33908,51357:33911,51358:33913,51359:33915,51360:33916,51361:21462,51362:23094,51363:40843,51364:36259,51365:21435,51366:22280,51367:39079,51368:26435,51369:37275,51370:27849,51371:20840,51372:30154,51373:25331,51374:29356,51375:21048,51376:21149,51377:32570,51378:28820,51379:30264,51380:21364,51381:40522,51382:27063,51383:30830,51384:38592,51385:35033,51386:32676,51387:28982,51388:29123,51389:20873,51390:26579,51391:29924,51392:22756,51393:25880,51394:22199,51395:35753,51396:39286,51397:25200,51398:32469,51399:24825,51400:28909,51401:22764,51402:20161,51403:20154,51404:24525,51405:38887,51406:20219,51407:35748,51408:20995,51409:22922,51410:32427,51411:25172,51412:20173,51413:26085,51414:25102,51415:33592,51416:33993,51417:33635,51418:34701,51419:29076,51420:28342,51421:23481,51422:32466,51423:20887,51424:25545,51425:26580,51426:32905,51427:33593,51428:34837,51429:20754,51430:23418,51431:22914,51432:36785,51433:20083,51434:27741,51435:20837,51436:35109,51437:36719,51438:38446,51439:34122,51440:29790,51441:38160,51442:38384,51443:28070,51444:33509,51445:24369,51446:25746,51447:27922,51448:33832,51449:33134,51450:40131,51451:22622,51452:36187,51453:19977,51454:21441,51520:33917,51521:33918,51522:33919,51523:33920,51524:33921,51525:33923,51526:33924,51527:33925,51528:33926,51529:33930,51530:33933,51531:33935,51532:33936,51533:33937,51534:33938,51535:33939,51536:33940,51537:33941,51538:33942,51539:33944,51540:33946,51541:33947,51542:33949,51543:33950,51544:33951,51545:33952,51546:33954,51547:33955,51548:33956,51549:33957,51550:33958,51551:33959,51552:33960,51553:33961,51554:33962,51555:33963,51556:33964,51557:33965,51558:33966,51559:33968,51560:33969,51561:33971,51562:33973,51563:33974,51564:33975,51565:33979,51566:33980,51567:33982,51568:33984,51569:33986,51570:33987,51571:33989,51572:33990,51573:33991,51574:33992,51575:33995,51576:33996,51577:33998,51578:33999,51579:34002,51580:34004,51581:34005,51582:34007,51584:34008,51585:34009,51586:34010,51587:34011,51588:34012,51589:34014,51590:34017,51591:34018,51592:34020,51593:34023,51594:34024,51595:34025,51596:34026,51597:34027,51598:34029,51599:34030,51600:34031,51601:34033,51602:34034,51603:34035,51604:34036,51605:34037,51606:34038,51607:34039,51608:34040,51609:34041,51610:34042,51611:34043,51612:34045,51613:34046,51614:34048,51615:34049,51616:34050,51617:20254,51618:25955,51619:26705,51620:21971,51621:20007,51622:25620,51623:39578,51624:25195,51625:23234,51626:29791,51627:33394,51628:28073,51629:26862,51630:20711,51631:33678,51632:30722,51633:26432,51634:21049,51635:27801,51636:32433,51637:20667,51638:21861,51639:29022,51640:31579,51641:26194,51642:29642,51643:33515,51644:26441,51645:23665,51646:21024,51647:29053,51648:34923,51649:38378,51650:38485,51651:25797,51652:36193,51653:33203,51654:21892,51655:27733,51656:25159,51657:32558,51658:22674,51659:20260,51660:21830,51661:36175,51662:26188,51663:19978,51664:23578,51665:35059,51666:26786,51667:25422,51668:31245,51669:28903,51670:33421,51671:21242,51672:38902,51673:23569,51674:21736,51675:37045,51676:32461,51677:22882,51678:36170,51679:34503,51680:33292,51681:33293,51682:36198,51683:25668,51684:23556,51685:24913,51686:28041,51687:31038,51688:35774,51689:30775,51690:30003,51691:21627,51692:20280,51693:36523,51694:28145,51695:23072,51696:32453,51697:31070,51698:27784,51699:23457,51700:23158,51701:29978,51702:32958,51703:24910,51704:28183,51705:22768,51706:29983,51707:29989,51708:29298,51709:21319,51710:32499,51776:34051,51777:34052,51778:34053,51779:34054,51780:34055,51781:34056,51782:34057,51783:34058,51784:34059,51785:34061,51786:34062,51787:34063,51788:34064,51789:34066,51790:34068,51791:34069,51792:34070,51793:34072,51794:34073,51795:34075,51796:34076,51797:34077,51798:34078,51799:34080,51800:34082,51801:34083,51802:34084,51803:34085,51804:34086,51805:34087,51806:34088,51807:34089,51808:34090,51809:34093,51810:34094,51811:34095,51812:34096,51813:34097,51814:34098,51815:34099,51816:34100,51817:34101,51818:34102,51819:34110,51820:34111,51821:34112,51822:34113,51823:34114,51824:34116,51825:34117,51826:34118,51827:34119,51828:34123,51829:34124,51830:34125,51831:34126,51832:34127,51833:34128,51834:34129,51835:34130,51836:34131,51837:34132,51838:34133,51840:34135,51841:34136,51842:34138,51843:34139,51844:34140,51845:34141,51846:34143,51847:34144,51848:34145,51849:34146,51850:34147,51851:34149,51852:34150,51853:34151,51854:34153,51855:34154,51856:34155,51857:34156,51858:34157,51859:34158,51860:34159,51861:34160,51862:34161,51863:34163,51864:34165,51865:34166,51866:34167,51867:34168,51868:34172,51869:34173,51870:34175,51871:34176,51872:34177,51873:30465,51874:30427,51875:21097,51876:32988,51877:22307,51878:24072,51879:22833,51880:29422,51881:26045,51882:28287,51883:35799,51884:23608,51885:34417,51886:21313,51887:30707,51888:25342,51889:26102,51890:20160,51891:39135,51892:34432,51893:23454,51894:35782,51895:21490,51896:30690,51897:20351,51898:23630,51899:39542,51900:22987,51901:24335,51902:31034,51903:22763,51904:19990,51905:26623,51906:20107,51907:25325,51908:35475,51909:36893,51910:21183,51911:26159,51912:21980,51913:22124,51914:36866,51915:20181,51916:20365,51917:37322,51918:39280,51919:27663,51920:24066,51921:24643,51922:23460,51923:35270,51924:35797,51925:25910,51926:25163,51927:39318,51928:23432,51929:23551,51930:25480,51931:21806,51932:21463,51933:30246,51934:20861,51935:34092,51936:26530,51937:26803,51938:27530,51939:25234,51940:36755,51941:21460,51942:33298,51943:28113,51944:30095,51945:20070,51946:36174,51947:23408,51948:29087,51949:34223,51950:26257,51951:26329,51952:32626,51953:34560,51954:40653,51955:40736,51956:23646,51957:26415,51958:36848,51959:26641,51960:26463,51961:25101,51962:31446,51963:22661,51964:24246,51965:25968,51966:28465,52032:34178,52033:34179,52034:34182,52035:34184,52036:34185,52037:34186,52038:34187,52039:34188,52040:34189,52041:34190,52042:34192,52043:34193,52044:34194,52045:34195,52046:34196,52047:34197,52048:34198,52049:34199,52050:34200,52051:34201,52052:34202,52053:34205,52054:34206,52055:34207,52056:34208,52057:34209,52058:34210,52059:34211,52060:34213,52061:34214,52062:34215,52063:34217,52064:34219,52065:34220,52066:34221,52067:34225,52068:34226,52069:34227,52070:34228,52071:34229,52072:34230,52073:34232,52074:34234,52075:34235,52076:34236,52077:34237,52078:34238,52079:34239,52080:34240,52081:34242,52082:34243,52083:34244,52084:34245,52085:34246,52086:34247,52087:34248,52088:34250,52089:34251,52090:34252,52091:34253,52092:34254,52093:34257,52094:34258,52096:34260,52097:34262,52098:34263,52099:34264,52100:34265,52101:34266,52102:34267,52103:34269,52104:34270,52105:34271,52106:34272,52107:34273,52108:34274,52109:34275,52110:34277,52111:34278,52112:34279,52113:34280,52114:34282,52115:34283,52116:34284,52117:34285,52118:34286,52119:34287,52120:34288,52121:34289,52122:34290,52123:34291,52124:34292,52125:34293,52126:34294,52127:34295,52128:34296,52129:24661,52130:21047,52131:32781,52132:25684,52133:34928,52134:29993,52135:24069,52136:26643,52137:25332,52138:38684,52139:21452,52140:29245,52141:35841,52142:27700,52143:30561,52144:31246,52145:21550,52146:30636,52147:39034,52148:33308,52149:35828,52150:30805,52151:26388,52152:28865,52153:26031,52154:25749,52155:22070,52156:24605,52157:31169,52158:21496,52159:19997,52160:27515,52161:32902,52162:23546,52163:21987,52164:22235,52165:20282,52166:20284,52167:39282,52168:24051,52169:26494,52170:32824,52171:24578,52172:39042,52173:36865,52174:23435,52175:35772,52176:35829,52177:25628,52178:33368,52179:25822,52180:22013,52181:33487,52182:37221,52183:20439,52184:32032,52185:36895,52186:31903,52187:20723,52188:22609,52189:28335,52190:23487,52191:35785,52192:32899,52193:37240,52194:33948,52195:31639,52196:34429,52197:38539,52198:38543,52199:32485,52200:39635,52201:30862,52202:23681,52203:31319,52204:36930,52205:38567,52206:31071,52207:23385,52208:25439,52209:31499,52210:34001,52211:26797,52212:21766,52213:32553,52214:29712,52215:32034,52216:38145,52217:25152,52218:22604,52219:20182,52220:23427,52221:22905,52222:22612,52288:34297,52289:34298,52290:34300,52291:34301,52292:34302,52293:34304,52294:34305,52295:34306,52296:34307,52297:34308,52298:34310,52299:34311,52300:34312,52301:34313,52302:34314,52303:34315,52304:34316,52305:34317,52306:34318,52307:34319,52308:34320,52309:34322,52310:34323,52311:34324,52312:34325,52313:34327,52314:34328,52315:34329,52316:34330,52317:34331,52318:34332,52319:34333,52320:34334,52321:34335,52322:34336,52323:34337,52324:34338,52325:34339,52326:34340,52327:34341,52328:34342,52329:34344,52330:34346,52331:34347,52332:34348,52333:34349,52334:34350,52335:34351,52336:34352,52337:34353,52338:34354,52339:34355,52340:34356,52341:34357,52342:34358,52343:34359,52344:34361,52345:34362,52346:34363,52347:34365,52348:34366,52349:34367,52350:34368,52352:34369,52353:34370,52354:34371,52355:34372,52356:34373,52357:34374,52358:34375,52359:34376,52360:34377,52361:34378,52362:34379,52363:34380,52364:34386,52365:34387,52366:34389,52367:34390,52368:34391,52369:34392,52370:34393,52371:34395,52372:34396,52373:34397,52374:34399,52375:34400,52376:34401,52377:34403,52378:34404,52379:34405,52380:34406,52381:34407,52382:34408,52383:34409,52384:34410,52385:29549,52386:25374,52387:36427,52388:36367,52389:32974,52390:33492,52391:25260,52392:21488,52393:27888,52394:37214,52395:22826,52396:24577,52397:27760,52398:22349,52399:25674,52400:36138,52401:30251,52402:28393,52403:22363,52404:27264,52405:30192,52406:28525,52407:35885,52408:35848,52409:22374,52410:27631,52411:34962,52412:30899,52413:25506,52414:21497,52415:28845,52416:27748,52417:22616,52418:25642,52419:22530,52420:26848,52421:33179,52422:21776,52423:31958,52424:20504,52425:36538,52426:28108,52427:36255,52428:28907,52429:25487,52430:28059,52431:28372,52432:32486,52433:33796,52434:26691,52435:36867,52436:28120,52437:38518,52438:35752,52439:22871,52440:29305,52441:34276,52442:33150,52443:30140,52444:35466,52445:26799,52446:21076,52447:36386,52448:38161,52449:25552,52450:39064,52451:36420,52452:21884,52453:20307,52454:26367,52455:22159,52456:24789,52457:28053,52458:21059,52459:23625,52460:22825,52461:28155,52462:22635,52463:30000,52464:29980,52465:24684,52466:33300,52467:33094,52468:25361,52469:26465,52470:36834,52471:30522,52472:36339,52473:36148,52474:38081,52475:24086,52476:21381,52477:21548,52478:28867,52544:34413,52545:34415,52546:34416,52547:34418,52548:34419,52549:34420,52550:34421,52551:34422,52552:34423,52553:34424,52554:34435,52555:34436,52556:34437,52557:34438,52558:34439,52559:34440,52560:34441,52561:34446,52562:34447,52563:34448,52564:34449,52565:34450,52566:34452,52567:34454,52568:34455,52569:34456,52570:34457,52571:34458,52572:34459,52573:34462,52574:34463,52575:34464,52576:34465,52577:34466,52578:34469,52579:34470,52580:34475,52581:34477,52582:34478,52583:34482,52584:34483,52585:34487,52586:34488,52587:34489,52588:34491,52589:34492,52590:34493,52591:34494,52592:34495,52593:34497,52594:34498,52595:34499,52596:34501,52597:34504,52598:34508,52599:34509,52600:34514,52601:34515,52602:34517,52603:34518,52604:34519,52605:34522,52606:34524,52608:34525,52609:34528,52610:34529,52611:34530,52612:34531,52613:34533,52614:34534,52615:34535,52616:34536,52617:34538,52618:34539,52619:34540,52620:34543,52621:34549,52622:34550,52623:34551,52624:34554,52625:34555,52626:34556,52627:34557,52628:34559,52629:34561,52630:34564,52631:34565,52632:34566,52633:34571,52634:34572,52635:34574,52636:34575,52637:34576,52638:34577,52639:34580,52640:34582,52641:27712,52642:24311,52643:20572,52644:20141,52645:24237,52646:25402,52647:33351,52648:36890,52649:26704,52650:37230,52651:30643,52652:21516,52653:38108,52654:24420,52655:31461,52656:26742,52657:25413,52658:31570,52659:32479,52660:30171,52661:20599,52662:25237,52663:22836,52664:36879,52665:20984,52666:31171,52667:31361,52668:22270,52669:24466,52670:36884,52671:28034,52672:23648,52673:22303,52674:21520,52675:20820,52676:28237,52677:22242,52678:25512,52679:39059,52680:33151,52681:34581,52682:35114,52683:36864,52684:21534,52685:23663,52686:33216,52687:25302,52688:25176,52689:33073,52690:40501,52691:38464,52692:39534,52693:39548,52694:26925,52695:22949,52696:25299,52697:21822,52698:25366,52699:21703,52700:34521,52701:27964,52702:23043,52703:29926,52704:34972,52705:27498,52706:22806,52707:35916,52708:24367,52709:28286,52710:29609,52711:39037,52712:20024,52713:28919,52714:23436,52715:30871,52716:25405,52717:26202,52718:30358,52719:24779,52720:23451,52721:23113,52722:19975,52723:33109,52724:27754,52725:29579,52726:20129,52727:26505,52728:32593,52729:24448,52730:26106,52731:26395,52732:24536,52733:22916,52734:23041,52800:34585,52801:34587,52802:34589,52803:34591,52804:34592,52805:34596,52806:34598,52807:34599,52808:34600,52809:34602,52810:34603,52811:34604,52812:34605,52813:34607,52814:34608,52815:34610,52816:34611,52817:34613,52818:34614,52819:34616,52820:34617,52821:34618,52822:34620,52823:34621,52824:34624,52825:34625,52826:34626,52827:34627,52828:34628,52829:34629,52830:34630,52831:34634,52832:34635,52833:34637,52834:34639,52835:34640,52836:34641,52837:34642,52838:34644,52839:34645,52840:34646,52841:34648,52842:34650,52843:34651,52844:34652,52845:34653,52846:34654,52847:34655,52848:34657,52849:34658,52850:34662,52851:34663,52852:34664,52853:34665,52854:34666,52855:34667,52856:34668,52857:34669,52858:34671,52859:34673,52860:34674,52861:34675,52862:34677,52864:34679,52865:34680,52866:34681,52867:34682,52868:34687,52869:34688,52870:34689,52871:34692,52872:34694,52873:34695,52874:34697,52875:34698,52876:34700,52877:34702,52878:34703,52879:34704,52880:34705,52881:34706,52882:34708,52883:34709,52884:34710,52885:34712,52886:34713,52887:34714,52888:34715,52889:34716,52890:34717,52891:34718,52892:34720,52893:34721,52894:34722,52895:34723,52896:34724,52897:24013,52898:24494,52899:21361,52900:38886,52901:36829,52902:26693,52903:22260,52904:21807,52905:24799,52906:20026,52907:28493,52908:32500,52909:33479,52910:33806,52911:22996,52912:20255,52913:20266,52914:23614,52915:32428,52916:26410,52917:34074,52918:21619,52919:30031,52920:32963,52921:21890,52922:39759,52923:20301,52924:28205,52925:35859,52926:23561,52927:24944,52928:21355,52929:30239,52930:28201,52931:34442,52932:25991,52933:38395,52934:32441,52935:21563,52936:31283,52937:32010,52938:38382,52939:21985,52940:32705,52941:29934,52942:25373,52943:34583,52944:28065,52945:31389,52946:25105,52947:26017,52948:21351,52949:25569,52950:27779,52951:24043,52952:21596,52953:38056,52954:20044,52955:27745,52956:35820,52957:23627,52958:26080,52959:33436,52960:26791,52961:21566,52962:21556,52963:27595,52964:27494,52965:20116,52966:25410,52967:21320,52968:33310,52969:20237,52970:20398,52971:22366,52972:25098,52973:38654,52974:26212,52975:29289,52976:21247,52977:21153,52978:24735,52979:35823,52980:26132,52981:29081,52982:26512,52983:35199,52984:30802,52985:30717,52986:26224,52987:22075,52988:21560,52989:38177,52990:29306,53056:34725,53057:34726,53058:34727,53059:34729,53060:34730,53061:34734,53062:34736,53063:34737,53064:34738,53065:34740,53066:34742,53067:34743,53068:34744,53069:34745,53070:34747,53071:34748,53072:34750,53073:34751,53074:34753,53075:34754,53076:34755,53077:34756,53078:34757,53079:34759,53080:34760,53081:34761,53082:34764,53083:34765,53084:34766,53085:34767,53086:34768,53087:34772,53088:34773,53089:34774,53090:34775,53091:34776,53092:34777,53093:34778,53094:34780,53095:34781,53096:34782,53097:34783,53098:34785,53099:34786,53100:34787,53101:34788,53102:34790,53103:34791,53104:34792,53105:34793,53106:34795,53107:34796,53108:34797,53109:34799,53110:34800,53111:34801,53112:34802,53113:34803,53114:34804,53115:34805,53116:34806,53117:34807,53118:34808,53120:34810,53121:34811,53122:34812,53123:34813,53124:34815,53125:34816,53126:34817,53127:34818,53128:34820,53129:34821,53130:34822,53131:34823,53132:34824,53133:34825,53134:34827,53135:34828,53136:34829,53137:34830,53138:34831,53139:34832,53140:34833,53141:34834,53142:34836,53143:34839,53144:34840,53145:34841,53146:34842,53147:34844,53148:34845,53149:34846,53150:34847,53151:34848,53152:34851,53153:31232,53154:24687,53155:24076,53156:24713,53157:33181,53158:22805,53159:24796,53160:29060,53161:28911,53162:28330,53163:27728,53164:29312,53165:27268,53166:34989,53167:24109,53168:20064,53169:23219,53170:21916,53171:38115,53172:27927,53173:31995,53174:38553,53175:25103,53176:32454,53177:30606,53178:34430,53179:21283,53180:38686,53181:36758,53182:26247,53183:23777,53184:20384,53185:29421,53186:19979,53187:21414,53188:22799,53189:21523,53190:25472,53191:38184,53192:20808,53193:20185,53194:40092,53195:32420,53196:21688,53197:36132,53198:34900,53199:33335,53200:38386,53201:28046,53202:24358,53203:23244,53204:26174,53205:38505,53206:29616,53207:29486,53208:21439,53209:33146,53210:39301,53211:32673,53212:23466,53213:38519,53214:38480,53215:32447,53216:30456,53217:21410,53218:38262,53219:39321,53220:31665,53221:35140,53222:28248,53223:20065,53224:32724,53225:31077,53226:35814,53227:24819,53228:21709,53229:20139,53230:39033,53231:24055,53232:27233,53233:20687,53234:21521,53235:35937,53236:33831,53237:30813,53238:38660,53239:21066,53240:21742,53241:22179,53242:38144,53243:28040,53244:23477,53245:28102,53246:26195,53312:34852,53313:34853,53314:34854,53315:34855,53316:34856,53317:34857,53318:34858,53319:34859,53320:34860,53321:34861,53322:34862,53323:34863,53324:34864,53325:34865,53326:34867,53327:34868,53328:34869,53329:34870,53330:34871,53331:34872,53332:34874,53333:34875,53334:34877,53335:34878,53336:34879,53337:34881,53338:34882,53339:34883,53340:34886,53341:34887,53342:34888,53343:34889,53344:34890,53345:34891,53346:34894,53347:34895,53348:34896,53349:34897,53350:34898,53351:34899,53352:34901,53353:34902,53354:34904,53355:34906,53356:34907,53357:34908,53358:34909,53359:34910,53360:34911,53361:34912,53362:34918,53363:34919,53364:34922,53365:34925,53366:34927,53367:34929,53368:34931,53369:34932,53370:34933,53371:34934,53372:34936,53373:34937,53374:34938,53376:34939,53377:34940,53378:34944,53379:34947,53380:34950,53381:34951,53382:34953,53383:34954,53384:34956,53385:34958,53386:34959,53387:34960,53388:34961,53389:34963,53390:34964,53391:34965,53392:34967,53393:34968,53394:34969,53395:34970,53396:34971,53397:34973,53398:34974,53399:34975,53400:34976,53401:34977,53402:34979,53403:34981,53404:34982,53405:34983,53406:34984,53407:34985,53408:34986,53409:23567,53410:23389,53411:26657,53412:32918,53413:21880,53414:31505,53415:25928,53416:26964,53417:20123,53418:27463,53419:34638,53420:38795,53421:21327,53422:25375,53423:25658,53424:37034,53425:26012,53426:32961,53427:35856,53428:20889,53429:26800,53430:21368,53431:34809,53432:25032,53433:27844,53434:27899,53435:35874,53436:23633,53437:34218,53438:33455,53439:38156,53440:27427,53441:36763,53442:26032,53443:24571,53444:24515,53445:20449,53446:34885,53447:26143,53448:33125,53449:29481,53450:24826,53451:20852,53452:21009,53453:22411,53454:24418,53455:37026,53456:34892,53457:37266,53458:24184,53459:26447,53460:24615,53461:22995,53462:20804,53463:20982,53464:33016,53465:21256,53466:27769,53467:38596,53468:29066,53469:20241,53470:20462,53471:32670,53472:26429,53473:21957,53474:38152,53475:31168,53476:34966,53477:32483,53478:22687,53479:25100,53480:38656,53481:34394,53482:22040,53483:39035,53484:24464,53485:35768,53486:33988,53487:37207,53488:21465,53489:26093,53490:24207,53491:30044,53492:24676,53493:32110,53494:23167,53495:32490,53496:32493,53497:36713,53498:21927,53499:23459,53500:24748,53501:26059,53502:29572,53568:34988,53569:34990,53570:34991,53571:34992,53572:34994,53573:34995,53574:34996,53575:34997,53576:34998,53577:35000,53578:35001,53579:35002,53580:35003,53581:35005,53582:35006,53583:35007,53584:35008,53585:35011,53586:35012,53587:35015,53588:35016,53589:35018,53590:35019,53591:35020,53592:35021,53593:35023,53594:35024,53595:35025,53596:35027,53597:35030,53598:35031,53599:35034,53600:35035,53601:35036,53602:35037,53603:35038,53604:35040,53605:35041,53606:35046,53607:35047,53608:35049,53609:35050,53610:35051,53611:35052,53612:35053,53613:35054,53614:35055,53615:35058,53616:35061,53617:35062,53618:35063,53619:35066,53620:35067,53621:35069,53622:35071,53623:35072,53624:35073,53625:35075,53626:35076,53627:35077,53628:35078,53629:35079,53630:35080,53632:35081,53633:35083,53634:35084,53635:35085,53636:35086,53637:35087,53638:35089,53639:35092,53640:35093,53641:35094,53642:35095,53643:35096,53644:35100,53645:35101,53646:35102,53647:35103,53648:35104,53649:35106,53650:35107,53651:35108,53652:35110,53653:35111,53654:35112,53655:35113,53656:35116,53657:35117,53658:35118,53659:35119,53660:35121,53661:35122,53662:35123,53663:35125,53664:35127,53665:36873,53666:30307,53667:30505,53668:32474,53669:38772,53670:34203,53671:23398,53672:31348,53673:38634,53674:34880,53675:21195,53676:29071,53677:24490,53678:26092,53679:35810,53680:23547,53681:39535,53682:24033,53683:27529,53684:27739,53685:35757,53686:35759,53687:36874,53688:36805,53689:21387,53690:25276,53691:40486,53692:40493,53693:21568,53694:20011,53695:33469,53696:29273,53697:34460,53698:23830,53699:34905,53700:28079,53701:38597,53702:21713,53703:20122,53704:35766,53705:28937,53706:21693,53707:38409,53708:28895,53709:28153,53710:30416,53711:20005,53712:30740,53713:34578,53714:23721,53715:24310,53716:35328,53717:39068,53718:38414,53719:28814,53720:27839,53721:22852,53722:25513,53723:30524,53724:34893,53725:28436,53726:33395,53727:22576,53728:29141,53729:21388,53730:30746,53731:38593,53732:21761,53733:24422,53734:28976,53735:23476,53736:35866,53737:39564,53738:27523,53739:22830,53740:40495,53741:31207,53742:26472,53743:25196,53744:20335,53745:30113,53746:32650,53747:27915,53748:38451,53749:27687,53750:20208,53751:30162,53752:20859,53753:26679,53754:28478,53755:36992,53756:33136,53757:22934,53758:29814,53824:35128,53825:35129,53826:35130,53827:35131,53828:35132,53829:35133,53830:35134,53831:35135,53832:35136,53833:35138,53834:35139,53835:35141,53836:35142,53837:35143,53838:35144,53839:35145,53840:35146,53841:35147,53842:35148,53843:35149,53844:35150,53845:35151,53846:35152,53847:35153,53848:35154,53849:35155,53850:35156,53851:35157,53852:35158,53853:35159,53854:35160,53855:35161,53856:35162,53857:35163,53858:35164,53859:35165,53860:35168,53861:35169,53862:35170,53863:35171,53864:35172,53865:35173,53866:35175,53867:35176,53868:35177,53869:35178,53870:35179,53871:35180,53872:35181,53873:35182,53874:35183,53875:35184,53876:35185,53877:35186,53878:35187,53879:35188,53880:35189,53881:35190,53882:35191,53883:35192,53884:35193,53885:35194,53886:35196,53888:35197,53889:35198,53890:35200,53891:35202,53892:35204,53893:35205,53894:35207,53895:35208,53896:35209,53897:35210,53898:35211,53899:35212,53900:35213,53901:35214,53902:35215,53903:35216,53904:35217,53905:35218,53906:35219,53907:35220,53908:35221,53909:35222,53910:35223,53911:35224,53912:35225,53913:35226,53914:35227,53915:35228,53916:35229,53917:35230,53918:35231,53919:35232,53920:35233,53921:25671,53922:23591,53923:36965,53924:31377,53925:35875,53926:23002,53927:21676,53928:33280,53929:33647,53930:35201,53931:32768,53932:26928,53933:22094,53934:32822,53935:29239,53936:37326,53937:20918,53938:20063,53939:39029,53940:25494,53941:19994,53942:21494,53943:26355,53944:33099,53945:22812,53946:28082,53947:19968,53948:22777,53949:21307,53950:25558,53951:38129,53952:20381,53953:20234,53954:34915,53955:39056,53956:22839,53957:36951,53958:31227,53959:20202,53960:33008,53961:30097,53962:27778,53963:23452,53964:23016,53965:24413,53966:26885,53967:34433,53968:20506,53969:24050,53970:20057,53971:30691,53972:20197,53973:33402,53974:25233,53975:26131,53976:37009,53977:23673,53978:20159,53979:24441,53980:33222,53981:36920,53982:32900,53983:30123,53984:20134,53985:35028,53986:24847,53987:27589,53988:24518,53989:20041,53990:30410,53991:28322,53992:35811,53993:35758,53994:35850,53995:35793,53996:24322,53997:32764,53998:32716,53999:32462,54000:33589,54001:33643,54002:22240,54003:27575,54004:38899,54005:38452,54006:23035,54007:21535,54008:38134,54009:28139,54010:23493,54011:39278,54012:23609,54013:24341,54014:38544,54080:35234,54081:35235,54082:35236,54083:35237,54084:35238,54085:35239,54086:35240,54087:35241,54088:35242,54089:35243,54090:35244,54091:35245,54092:35246,54093:35247,54094:35248,54095:35249,54096:35250,54097:35251,54098:35252,54099:35253,54100:35254,54101:35255,54102:35256,54103:35257,54104:35258,54105:35259,54106:35260,54107:35261,54108:35262,54109:35263,54110:35264,54111:35267,54112:35277,54113:35283,54114:35284,54115:35285,54116:35287,54117:35288,54118:35289,54119:35291,54120:35293,54121:35295,54122:35296,54123:35297,54124:35298,54125:35300,54126:35303,54127:35304,54128:35305,54129:35306,54130:35308,54131:35309,54132:35310,54133:35312,54134:35313,54135:35314,54136:35316,54137:35317,54138:35318,54139:35319,54140:35320,54141:35321,54142:35322,54144:35323,54145:35324,54146:35325,54147:35326,54148:35327,54149:35329,54150:35330,54151:35331,54152:35332,54153:35333,54154:35334,54155:35336,54156:35337,54157:35338,54158:35339,54159:35340,54160:35341,54161:35342,54162:35343,54163:35344,54164:35345,54165:35346,54166:35347,54167:35348,54168:35349,54169:35350,54170:35351,54171:35352,54172:35353,54173:35354,54174:35355,54175:35356,54176:35357,54177:21360,54178:33521,54179:27185,54180:23156,54181:40560,54182:24212,54183:32552,54184:33721,54185:33828,54186:33829,54187:33639,54188:34631,54189:36814,54190:36194,54191:30408,54192:24433,54193:39062,54194:30828,54195:26144,54196:21727,54197:25317,54198:20323,54199:33219,54200:30152,54201:24248,54202:38605,54203:36362,54204:34553,54205:21647,54206:27891,54207:28044,54208:27704,54209:24703,54210:21191,54211:29992,54212:24189,54213:20248,54214:24736,54215:24551,54216:23588,54217:30001,54218:37038,54219:38080,54220:29369,54221:27833,54222:28216,54223:37193,54224:26377,54225:21451,54226:21491,54227:20305,54228:37321,54229:35825,54230:21448,54231:24188,54232:36802,54233:28132,54234:20110,54235:30402,54236:27014,54237:34398,54238:24858,54239:33286,54240:20313,54241:20446,54242:36926,54243:40060,54244:24841,54245:28189,54246:28180,54247:38533,54248:20104,54249:23089,54250:38632,54251:19982,54252:23679,54253:31161,54254:23431,54255:35821,54256:32701,54257:29577,54258:22495,54259:33419,54260:37057,54261:21505,54262:36935,54263:21947,54264:23786,54265:24481,54266:24840,54267:27442,54268:29425,54269:32946,54270:35465,54336:35358,54337:35359,54338:35360,54339:35361,54340:35362,54341:35363,54342:35364,54343:35365,54344:35366,54345:35367,54346:35368,54347:35369,54348:35370,54349:35371,54350:35372,54351:35373,54352:35374,54353:35375,54354:35376,54355:35377,54356:35378,54357:35379,54358:35380,54359:35381,54360:35382,54361:35383,54362:35384,54363:35385,54364:35386,54365:35387,54366:35388,54367:35389,54368:35391,54369:35392,54370:35393,54371:35394,54372:35395,54373:35396,54374:35397,54375:35398,54376:35399,54377:35401,54378:35402,54379:35403,54380:35404,54381:35405,54382:35406,54383:35407,54384:35408,54385:35409,54386:35410,54387:35411,54388:35412,54389:35413,54390:35414,54391:35415,54392:35416,54393:35417,54394:35418,54395:35419,54396:35420,54397:35421,54398:35422,54400:35423,54401:35424,54402:35425,54403:35426,54404:35427,54405:35428,54406:35429,54407:35430,54408:35431,54409:35432,54410:35433,54411:35434,54412:35435,54413:35436,54414:35437,54415:35438,54416:35439,54417:35440,54418:35441,54419:35442,54420:35443,54421:35444,54422:35445,54423:35446,54424:35447,54425:35448,54426:35450,54427:35451,54428:35452,54429:35453,54430:35454,54431:35455,54432:35456,54433:28020,54434:23507,54435:35029,54436:39044,54437:35947,54438:39533,54439:40499,54440:28170,54441:20900,54442:20803,54443:22435,54444:34945,54445:21407,54446:25588,54447:36757,54448:22253,54449:21592,54450:22278,54451:29503,54452:28304,54453:32536,54454:36828,54455:33489,54456:24895,54457:24616,54458:38498,54459:26352,54460:32422,54461:36234,54462:36291,54463:38053,54464:23731,54465:31908,54466:26376,54467:24742,54468:38405,54469:32792,54470:20113,54471:37095,54472:21248,54473:38504,54474:20801,54475:36816,54476:34164,54477:37213,54478:26197,54479:38901,54480:23381,54481:21277,54482:30776,54483:26434,54484:26685,54485:21705,54486:28798,54487:23472,54488:36733,54489:20877,54490:22312,54491:21681,54492:25874,54493:26242,54494:36190,54495:36163,54496:33039,54497:33900,54498:36973,54499:31967,54500:20991,54501:34299,54502:26531,54503:26089,54504:28577,54505:34468,54506:36481,54507:22122,54508:36896,54509:30338,54510:28790,54511:29157,54512:36131,54513:25321,54514:21017,54515:27901,54516:36156,54517:24590,54518:22686,54519:24974,54520:26366,54521:36192,54522:25166,54523:21939,54524:28195,54525:26413,54526:36711,54592:35457,54593:35458,54594:35459,54595:35460,54596:35461,54597:35462,54598:35463,54599:35464,54600:35467,54601:35468,54602:35469,54603:35470,54604:35471,54605:35472,54606:35473,54607:35474,54608:35476,54609:35477,54610:35478,54611:35479,54612:35480,54613:35481,54614:35482,54615:35483,54616:35484,54617:35485,54618:35486,54619:35487,54620:35488,54621:35489,54622:35490,54623:35491,54624:35492,54625:35493,54626:35494,54627:35495,54628:35496,54629:35497,54630:35498,54631:35499,54632:35500,54633:35501,54634:35502,54635:35503,54636:35504,54637:35505,54638:35506,54639:35507,54640:35508,54641:35509,54642:35510,54643:35511,54644:35512,54645:35513,54646:35514,54647:35515,54648:35516,54649:35517,54650:35518,54651:35519,54652:35520,54653:35521,54654:35522,54656:35523,54657:35524,54658:35525,54659:35526,54660:35527,54661:35528,54662:35529,54663:35530,54664:35531,54665:35532,54666:35533,54667:35534,54668:35535,54669:35536,54670:35537,54671:35538,54672:35539,54673:35540,54674:35541,54675:35542,54676:35543,54677:35544,54678:35545,54679:35546,54680:35547,54681:35548,54682:35549,54683:35550,54684:35551,54685:35552,54686:35553,54687:35554,54688:35555,54689:38113,54690:38392,54691:30504,54692:26629,54693:27048,54694:21643,54695:20045,54696:28856,54697:35784,54698:25688,54699:25995,54700:23429,54701:31364,54702:20538,54703:23528,54704:30651,54705:27617,54706:35449,54707:31896,54708:27838,54709:30415,54710:26025,54711:36759,54712:23853,54713:23637,54714:34360,54715:26632,54716:21344,54717:25112,54718:31449,54719:28251,54720:32509,54721:27167,54722:31456,54723:24432,54724:28467,54725:24352,54726:25484,54727:28072,54728:26454,54729:19976,54730:24080,54731:36134,54732:20183,54733:32960,54734:30260,54735:38556,54736:25307,54737:26157,54738:25214,54739:27836,54740:36213,54741:29031,54742:32617,54743:20806,54744:32903,54745:21484,54746:36974,54747:25240,54748:21746,54749:34544,54750:36761,54751:32773,54752:38167,54753:34071,54754:36825,54755:27993,54756:29645,54757:26015,54758:30495,54759:29956,54760:30759,54761:33275,54762:36126,54763:38024,54764:20390,54765:26517,54766:30137,54767:35786,54768:38663,54769:25391,54770:38215,54771:38453,54772:33976,54773:25379,54774:30529,54775:24449,54776:29424,54777:20105,54778:24596,54779:25972,54780:25327,54781:27491,54782:25919,54848:35556,54849:35557,54850:35558,54851:35559,54852:35560,54853:35561,54854:35562,54855:35563,54856:35564,54857:35565,54858:35566,54859:35567,54860:35568,54861:35569,54862:35570,54863:35571,54864:35572,54865:35573,54866:35574,54867:35575,54868:35576,54869:35577,54870:35578,54871:35579,54872:35580,54873:35581,54874:35582,54875:35583,54876:35584,54877:35585,54878:35586,54879:35587,54880:35588,54881:35589,54882:35590,54883:35592,54884:35593,54885:35594,54886:35595,54887:35596,54888:35597,54889:35598,54890:35599,54891:35600,54892:35601,54893:35602,54894:35603,54895:35604,54896:35605,54897:35606,54898:35607,54899:35608,54900:35609,54901:35610,54902:35611,54903:35612,54904:35613,54905:35614,54906:35615,54907:35616,54908:35617,54909:35618,54910:35619,54912:35620,54913:35621,54914:35623,54915:35624,54916:35625,54917:35626,54918:35627,54919:35628,54920:35629,54921:35630,54922:35631,54923:35632,54924:35633,54925:35634,54926:35635,54927:35636,54928:35637,54929:35638,54930:35639,54931:35640,54932:35641,54933:35642,54934:35643,54935:35644,54936:35645,54937:35646,54938:35647,54939:35648,54940:35649,54941:35650,54942:35651,54943:35652,54944:35653,54945:24103,54946:30151,54947:37073,54948:35777,54949:33437,54950:26525,54951:25903,54952:21553,54953:34584,54954:30693,54955:32930,54956:33026,54957:27713,54958:20043,54959:32455,54960:32844,54961:30452,54962:26893,54963:27542,54964:25191,54965:20540,54966:20356,54967:22336,54968:25351,54969:27490,54970:36286,54971:21482,54972:26088,54973:32440,54974:24535,54975:25370,54976:25527,54977:33267,54978:33268,54979:32622,54980:24092,54981:23769,54982:21046,54983:26234,54984:31209,54985:31258,54986:36136,54987:28825,54988:30164,54989:28382,54990:27835,54991:31378,54992:20013,54993:30405,54994:24544,54995:38047,54996:34935,54997:32456,54998:31181,54999:32959,55000:37325,55001:20210,55002:20247,55003:33311,55004:21608,55005:24030,55006:27954,55007:35788,55008:31909,55009:36724,55010:32920,55011:24090,55012:21650,55013:30385,55014:23449,55015:26172,55016:39588,55017:29664,55018:26666,55019:34523,55020:26417,55021:29482,55022:35832,55023:35803,55024:36880,55025:31481,55026:28891,55027:29038,55028:25284,55029:30633,55030:22065,55031:20027,55032:33879,55033:26609,55034:21161,55035:34496,55036:36142,55037:38136,55038:31569,55104:35654,55105:35655,55106:35656,55107:35657,55108:35658,55109:35659,55110:35660,55111:35661,55112:35662,55113:35663,55114:35664,55115:35665,55116:35666,55117:35667,55118:35668,55119:35669,55120:35670,55121:35671,55122:35672,55123:35673,55124:35674,55125:35675,55126:35676,55127:35677,55128:35678,55129:35679,55130:35680,55131:35681,55132:35682,55133:35683,55134:35684,55135:35685,55136:35687,55137:35688,55138:35689,55139:35690,55140:35691,55141:35693,55142:35694,55143:35695,55144:35696,55145:35697,55146:35698,55147:35699,55148:35700,55149:35701,55150:35702,55151:35703,55152:35704,55153:35705,55154:35706,55155:35707,55156:35708,55157:35709,55158:35710,55159:35711,55160:35712,55161:35713,55162:35714,55163:35715,55164:35716,55165:35717,55166:35718,55168:35719,55169:35720,55170:35721,55171:35722,55172:35723,55173:35724,55174:35725,55175:35726,55176:35727,55177:35728,55178:35729,55179:35730,55180:35731,55181:35732,55182:35733,55183:35734,55184:35735,55185:35736,55186:35737,55187:35738,55188:35739,55189:35740,55190:35741,55191:35742,55192:35743,55193:35756,55194:35761,55195:35771,55196:35783,55197:35792,55198:35818,55199:35849,55200:35870,55201:20303,55202:27880,55203:31069,55204:39547,55205:25235,55206:29226,55207:25341,55208:19987,55209:30742,55210:36716,55211:25776,55212:36186,55213:31686,55214:26729,55215:24196,55216:35013,55217:22918,55218:25758,55219:22766,55220:29366,55221:26894,55222:38181,55223:36861,55224:36184,55225:22368,55226:32512,55227:35846,55228:20934,55229:25417,55230:25305,55231:21331,55232:26700,55233:29730,55234:33537,55235:37196,55236:21828,55237:30528,55238:28796,55239:27978,55240:20857,55241:21672,55242:36164,55243:23039,55244:28363,55245:28100,55246:23388,55247:32043,55248:20180,55249:31869,55250:28371,55251:23376,55252:33258,55253:28173,55254:23383,55255:39683,55256:26837,55257:36394,55258:23447,55259:32508,55260:24635,55261:32437,55262:37049,55263:36208,55264:22863,55265:25549,55266:31199,55267:36275,55268:21330,55269:26063,55270:31062,55271:35781,55272:38459,55273:32452,55274:38075,55275:32386,55276:22068,55277:37257,55278:26368,55279:32618,55280:23562,55281:36981,55282:26152,55283:24038,55284:20304,55285:26590,55286:20570,55287:20316,55288:22352,55289:24231,55290:59408,55291:59409,55292:59410,55293:59411,55294:59412,55360:35896,55361:35897,55362:35898,55363:35899,55364:35900,55365:35901,55366:35902,55367:35903,55368:35904,55369:35906,55370:35907,55371:35908,55372:35909,55373:35912,55374:35914,55375:35915,55376:35917,55377:35918,55378:35919,55379:35920,55380:35921,55381:35922,55382:35923,55383:35924,55384:35926,55385:35927,55386:35928,55387:35929,55388:35931,55389:35932,55390:35933,55391:35934,55392:35935,55393:35936,55394:35939,55395:35940,55396:35941,55397:35942,55398:35943,55399:35944,55400:35945,55401:35948,55402:35949,55403:35950,55404:35951,55405:35952,55406:35953,55407:35954,55408:35956,55409:35957,55410:35958,55411:35959,55412:35963,55413:35964,55414:35965,55415:35966,55416:35967,55417:35968,55418:35969,55419:35971,55420:35972,55421:35974,55422:35975,55424:35976,55425:35979,55426:35981,55427:35982,55428:35983,55429:35984,55430:35985,55431:35986,55432:35987,55433:35989,55434:35990,55435:35991,55436:35993,55437:35994,55438:35995,55439:35996,55440:35997,55441:35998,55442:35999,55443:36000,55444:36001,55445:36002,55446:36003,55447:36004,55448:36005,55449:36006,55450:36007,55451:36008,55452:36009,55453:36010,55454:36011,55455:36012,55456:36013,55457:20109,55458:19980,55459:20800,55460:19984,55461:24319,55462:21317,55463:19989,55464:20120,55465:19998,55466:39730,55467:23404,55468:22121,55469:20008,55470:31162,55471:20031,55472:21269,55473:20039,55474:22829,55475:29243,55476:21358,55477:27664,55478:22239,55479:32996,55480:39319,55481:27603,55482:30590,55483:40727,55484:20022,55485:20127,55486:40720,55487:20060,55488:20073,55489:20115,55490:33416,55491:23387,55492:21868,55493:22031,55494:20164,55495:21389,55496:21405,55497:21411,55498:21413,55499:21422,55500:38757,55501:36189,55502:21274,55503:21493,55504:21286,55505:21294,55506:21310,55507:36188,55508:21350,55509:21347,55510:20994,55511:21000,55512:21006,55513:21037,55514:21043,55515:21055,55516:21056,55517:21068,55518:21086,55519:21089,55520:21084,55521:33967,55522:21117,55523:21122,55524:21121,55525:21136,55526:21139,55527:20866,55528:32596,55529:20155,55530:20163,55531:20169,55532:20162,55533:20200,55534:20193,55535:20203,55536:20190,55537:20251,55538:20211,55539:20258,55540:20324,55541:20213,55542:20261,55543:20263,55544:20233,55545:20267,55546:20318,55547:20327,55548:25912,55549:20314,55550:20317,55616:36014,55617:36015,55618:36016,55619:36017,55620:36018,55621:36019,55622:36020,55623:36021,55624:36022,55625:36023,55626:36024,55627:36025,55628:36026,55629:36027,55630:36028,55631:36029,55632:36030,55633:36031,55634:36032,55635:36033,55636:36034,55637:36035,55638:36036,55639:36037,55640:36038,55641:36039,55642:36040,55643:36041,55644:36042,55645:36043,55646:36044,55647:36045,55648:36046,55649:36047,55650:36048,55651:36049,55652:36050,55653:36051,55654:36052,55655:36053,55656:36054,55657:36055,55658:36056,55659:36057,55660:36058,55661:36059,55662:36060,55663:36061,55664:36062,55665:36063,55666:36064,55667:36065,55668:36066,55669:36067,55670:36068,55671:36069,55672:36070,55673:36071,55674:36072,55675:36073,55676:36074,55677:36075,55678:36076,55680:36077,55681:36078,55682:36079,55683:36080,55684:36081,55685:36082,55686:36083,55687:36084,55688:36085,55689:36086,55690:36087,55691:36088,55692:36089,55693:36090,55694:36091,55695:36092,55696:36093,55697:36094,55698:36095,55699:36096,55700:36097,55701:36098,55702:36099,55703:36100,55704:36101,55705:36102,55706:36103,55707:36104,55708:36105,55709:36106,55710:36107,55711:36108,55712:36109,55713:20319,55714:20311,55715:20274,55716:20285,55717:20342,55718:20340,55719:20369,55720:20361,55721:20355,55722:20367,55723:20350,55724:20347,55725:20394,55726:20348,55727:20396,55728:20372,55729:20454,55730:20456,55731:20458,55732:20421,55733:20442,55734:20451,55735:20444,55736:20433,55737:20447,55738:20472,55739:20521,55740:20556,55741:20467,55742:20524,55743:20495,55744:20526,55745:20525,55746:20478,55747:20508,55748:20492,55749:20517,55750:20520,55751:20606,55752:20547,55753:20565,55754:20552,55755:20558,55756:20588,55757:20603,55758:20645,55759:20647,55760:20649,55761:20666,55762:20694,55763:20742,55764:20717,55765:20716,55766:20710,55767:20718,55768:20743,55769:20747,55770:20189,55771:27709,55772:20312,55773:20325,55774:20430,55775:40864,55776:27718,55777:31860,55778:20846,55779:24061,55780:40649,55781:39320,55782:20865,55783:22804,55784:21241,55785:21261,55786:35335,55787:21264,55788:20971,55789:22809,55790:20821,55791:20128,55792:20822,55793:20147,55794:34926,55795:34980,55796:20149,55797:33044,55798:35026,55799:31104,55800:23348,55801:34819,55802:32696,55803:20907,55804:20913,55805:20925,55806:20924,55872:36110,55873:36111,55874:36112,55875:36113,55876:36114,55877:36115,55878:36116,55879:36117,55880:36118,55881:36119,55882:36120,55883:36121,55884:36122,55885:36123,55886:36124,55887:36128,55888:36177,55889:36178,55890:36183,55891:36191,55892:36197,55893:36200,55894:36201,55895:36202,55896:36204,55897:36206,55898:36207,55899:36209,55900:36210,55901:36216,55902:36217,55903:36218,55904:36219,55905:36220,55906:36221,55907:36222,55908:36223,55909:36224,55910:36226,55911:36227,55912:36230,55913:36231,55914:36232,55915:36233,55916:36236,55917:36237,55918:36238,55919:36239,55920:36240,55921:36242,55922:36243,55923:36245,55924:36246,55925:36247,55926:36248,55927:36249,55928:36250,55929:36251,55930:36252,55931:36253,55932:36254,55933:36256,55934:36257,55936:36258,55937:36260,55938:36261,55939:36262,55940:36263,55941:36264,55942:36265,55943:36266,55944:36267,55945:36268,55946:36269,55947:36270,55948:36271,55949:36272,55950:36274,55951:36278,55952:36279,55953:36281,55954:36283,55955:36285,55956:36288,55957:36289,55958:36290,55959:36293,55960:36295,55961:36296,55962:36297,55963:36298,55964:36301,55965:36304,55966:36306,55967:36307,55968:36308,55969:20935,55970:20886,55971:20898,55972:20901,55973:35744,55974:35750,55975:35751,55976:35754,55977:35764,55978:35765,55979:35767,55980:35778,55981:35779,55982:35787,55983:35791,55984:35790,55985:35794,55986:35795,55987:35796,55988:35798,55989:35800,55990:35801,55991:35804,55992:35807,55993:35808,55994:35812,55995:35816,55996:35817,55997:35822,55998:35824,55999:35827,56000:35830,56001:35833,56002:35836,56003:35839,56004:35840,56005:35842,56006:35844,56007:35847,56008:35852,56009:35855,56010:35857,56011:35858,56012:35860,56013:35861,56014:35862,56015:35865,56016:35867,56017:35864,56018:35869,56019:35871,56020:35872,56021:35873,56022:35877,56023:35879,56024:35882,56025:35883,56026:35886,56027:35887,56028:35890,56029:35891,56030:35893,56031:35894,56032:21353,56033:21370,56034:38429,56035:38434,56036:38433,56037:38449,56038:38442,56039:38461,56040:38460,56041:38466,56042:38473,56043:38484,56044:38495,56045:38503,56046:38508,56047:38514,56048:38516,56049:38536,56050:38541,56051:38551,56052:38576,56053:37015,56054:37019,56055:37021,56056:37017,56057:37036,56058:37025,56059:37044,56060:37043,56061:37046,56062:37050,56128:36309,56129:36312,56130:36313,56131:36316,56132:36320,56133:36321,56134:36322,56135:36325,56136:36326,56137:36327,56138:36329,56139:36333,56140:36334,56141:36336,56142:36337,56143:36338,56144:36340,56145:36342,56146:36348,56147:36350,56148:36351,56149:36352,56150:36353,56151:36354,56152:36355,56153:36356,56154:36358,56155:36359,56156:36360,56157:36363,56158:36365,56159:36366,56160:36368,56161:36369,56162:36370,56163:36371,56164:36373,56165:36374,56166:36375,56167:36376,56168:36377,56169:36378,56170:36379,56171:36380,56172:36384,56173:36385,56174:36388,56175:36389,56176:36390,56177:36391,56178:36392,56179:36395,56180:36397,56181:36400,56182:36402,56183:36403,56184:36404,56185:36406,56186:36407,56187:36408,56188:36411,56189:36412,56190:36414,56192:36415,56193:36419,56194:36421,56195:36422,56196:36428,56197:36429,56198:36430,56199:36431,56200:36432,56201:36435,56202:36436,56203:36437,56204:36438,56205:36439,56206:36440,56207:36442,56208:36443,56209:36444,56210:36445,56211:36446,56212:36447,56213:36448,56214:36449,56215:36450,56216:36451,56217:36452,56218:36453,56219:36455,56220:36456,56221:36458,56222:36459,56223:36462,56224:36465,56225:37048,56226:37040,56227:37071,56228:37061,56229:37054,56230:37072,56231:37060,56232:37063,56233:37075,56234:37094,56235:37090,56236:37084,56237:37079,56238:37083,56239:37099,56240:37103,56241:37118,56242:37124,56243:37154,56244:37150,56245:37155,56246:37169,56247:37167,56248:37177,56249:37187,56250:37190,56251:21005,56252:22850,56253:21154,56254:21164,56255:21165,56256:21182,56257:21759,56258:21200,56259:21206,56260:21232,56261:21471,56262:29166,56263:30669,56264:24308,56265:20981,56266:20988,56267:39727,56268:21430,56269:24321,56270:30042,56271:24047,56272:22348,56273:22441,56274:22433,56275:22654,56276:22716,56277:22725,56278:22737,56279:22313,56280:22316,56281:22314,56282:22323,56283:22329,56284:22318,56285:22319,56286:22364,56287:22331,56288:22338,56289:22377,56290:22405,56291:22379,56292:22406,56293:22396,56294:22395,56295:22376,56296:22381,56297:22390,56298:22387,56299:22445,56300:22436,56301:22412,56302:22450,56303:22479,56304:22439,56305:22452,56306:22419,56307:22432,56308:22485,56309:22488,56310:22490,56311:22489,56312:22482,56313:22456,56314:22516,56315:22511,56316:22520,56317:22500,56318:22493,56384:36467,56385:36469,56386:36471,56387:36472,56388:36473,56389:36474,56390:36475,56391:36477,56392:36478,56393:36480,56394:36482,56395:36483,56396:36484,56397:36486,56398:36488,56399:36489,56400:36490,56401:36491,56402:36492,56403:36493,56404:36494,56405:36497,56406:36498,56407:36499,56408:36501,56409:36502,56410:36503,56411:36504,56412:36505,56413:36506,56414:36507,56415:36509,56416:36511,56417:36512,56418:36513,56419:36514,56420:36515,56421:36516,56422:36517,56423:36518,56424:36519,56425:36520,56426:36521,56427:36522,56428:36525,56429:36526,56430:36528,56431:36529,56432:36531,56433:36532,56434:36533,56435:36534,56436:36535,56437:36536,56438:36537,56439:36539,56440:36540,56441:36541,56442:36542,56443:36543,56444:36544,56445:36545,56446:36546,56448:36547,56449:36548,56450:36549,56451:36550,56452:36551,56453:36552,56454:36553,56455:36554,56456:36555,56457:36556,56458:36557,56459:36559,56460:36560,56461:36561,56462:36562,56463:36563,56464:36564,56465:36565,56466:36566,56467:36567,56468:36568,56469:36569,56470:36570,56471:36571,56472:36572,56473:36573,56474:36574,56475:36575,56476:36576,56477:36577,56478:36578,56479:36579,56480:36580,56481:22539,56482:22541,56483:22525,56484:22509,56485:22528,56486:22558,56487:22553,56488:22596,56489:22560,56490:22629,56491:22636,56492:22657,56493:22665,56494:22682,56495:22656,56496:39336,56497:40729,56498:25087,56499:33401,56500:33405,56501:33407,56502:33423,56503:33418,56504:33448,56505:33412,56506:33422,56507:33425,56508:33431,56509:33433,56510:33451,56511:33464,56512:33470,56513:33456,56514:33480,56515:33482,56516:33507,56517:33432,56518:33463,56519:33454,56520:33483,56521:33484,56522:33473,56523:33449,56524:33460,56525:33441,56526:33450,56527:33439,56528:33476,56529:33486,56530:33444,56531:33505,56532:33545,56533:33527,56534:33508,56535:33551,56536:33543,56537:33500,56538:33524,56539:33490,56540:33496,56541:33548,56542:33531,56543:33491,56544:33553,56545:33562,56546:33542,56547:33556,56548:33557,56549:33504,56550:33493,56551:33564,56552:33617,56553:33627,56554:33628,56555:33544,56556:33682,56557:33596,56558:33588,56559:33585,56560:33691,56561:33630,56562:33583,56563:33615,56564:33607,56565:33603,56566:33631,56567:33600,56568:33559,56569:33632,56570:33581,56571:33594,56572:33587,56573:33638,56574:33637,56640:36581,56641:36582,56642:36583,56643:36584,56644:36585,56645:36586,56646:36587,56647:36588,56648:36589,56649:36590,56650:36591,56651:36592,56652:36593,56653:36594,56654:36595,56655:36596,56656:36597,56657:36598,56658:36599,56659:36600,56660:36601,56661:36602,56662:36603,56663:36604,56664:36605,56665:36606,56666:36607,56667:36608,56668:36609,56669:36610,56670:36611,56671:36612,56672:36613,56673:36614,56674:36615,56675:36616,56676:36617,56677:36618,56678:36619,56679:36620,56680:36621,56681:36622,56682:36623,56683:36624,56684:36625,56685:36626,56686:36627,56687:36628,56688:36629,56689:36630,56690:36631,56691:36632,56692:36633,56693:36634,56694:36635,56695:36636,56696:36637,56697:36638,56698:36639,56699:36640,56700:36641,56701:36642,56702:36643,56704:36644,56705:36645,56706:36646,56707:36647,56708:36648,56709:36649,56710:36650,56711:36651,56712:36652,56713:36653,56714:36654,56715:36655,56716:36656,56717:36657,56718:36658,56719:36659,56720:36660,56721:36661,56722:36662,56723:36663,56724:36664,56725:36665,56726:36666,56727:36667,56728:36668,56729:36669,56730:36670,56731:36671,56732:36672,56733:36673,56734:36674,56735:36675,56736:36676,56737:33640,56738:33563,56739:33641,56740:33644,56741:33642,56742:33645,56743:33646,56744:33712,56745:33656,56746:33715,56747:33716,56748:33696,56749:33706,56750:33683,56751:33692,56752:33669,56753:33660,56754:33718,56755:33705,56756:33661,56757:33720,56758:33659,56759:33688,56760:33694,56761:33704,56762:33722,56763:33724,56764:33729,56765:33793,56766:33765,56767:33752,56768:22535,56769:33816,56770:33803,56771:33757,56772:33789,56773:33750,56774:33820,56775:33848,56776:33809,56777:33798,56778:33748,56779:33759,56780:33807,56781:33795,56782:33784,56783:33785,56784:33770,56785:33733,56786:33728,56787:33830,56788:33776,56789:33761,56790:33884,56791:33873,56792:33882,56793:33881,56794:33907,56795:33927,56796:33928,56797:33914,56798:33929,56799:33912,56800:33852,56801:33862,56802:33897,56803:33910,56804:33932,56805:33934,56806:33841,56807:33901,56808:33985,56809:33997,56810:34000,56811:34022,56812:33981,56813:34003,56814:33994,56815:33983,56816:33978,56817:34016,56818:33953,56819:33977,56820:33972,56821:33943,56822:34021,56823:34019,56824:34060,56825:29965,56826:34104,56827:34032,56828:34105,56829:34079,56830:34106,56896:36677,56897:36678,56898:36679,56899:36680,56900:36681,56901:36682,56902:36683,56903:36684,56904:36685,56905:36686,56906:36687,56907:36688,56908:36689,56909:36690,56910:36691,56911:36692,56912:36693,56913:36694,56914:36695,56915:36696,56916:36697,56917:36698,56918:36699,56919:36700,56920:36701,56921:36702,56922:36703,56923:36704,56924:36705,56925:36706,56926:36707,56927:36708,56928:36709,56929:36714,56930:36736,56931:36748,56932:36754,56933:36765,56934:36768,56935:36769,56936:36770,56937:36772,56938:36773,56939:36774,56940:36775,56941:36778,56942:36780,56943:36781,56944:36782,56945:36783,56946:36786,56947:36787,56948:36788,56949:36789,56950:36791,56951:36792,56952:36794,56953:36795,56954:36796,56955:36799,56956:36800,56957:36803,56958:36806,56960:36809,56961:36810,56962:36811,56963:36812,56964:36813,56965:36815,56966:36818,56967:36822,56968:36823,56969:36826,56970:36832,56971:36833,56972:36835,56973:36839,56974:36844,56975:36847,56976:36849,56977:36850,56978:36852,56979:36853,56980:36854,56981:36858,56982:36859,56983:36860,56984:36862,56985:36863,56986:36871,56987:36872,56988:36876,56989:36878,56990:36883,56991:36885,56992:36888,56993:34134,56994:34107,56995:34047,56996:34044,56997:34137,56998:34120,56999:34152,57000:34148,57001:34142,57002:34170,57003:30626,57004:34115,57005:34162,57006:34171,57007:34212,57008:34216,57009:34183,57010:34191,57011:34169,57012:34222,57013:34204,57014:34181,57015:34233,57016:34231,57017:34224,57018:34259,57019:34241,57020:34268,57021:34303,57022:34343,57023:34309,57024:34345,57025:34326,57026:34364,57027:24318,57028:24328,57029:22844,57030:22849,57031:32823,57032:22869,57033:22874,57034:22872,57035:21263,57036:23586,57037:23589,57038:23596,57039:23604,57040:25164,57041:25194,57042:25247,57043:25275,57044:25290,57045:25306,57046:25303,57047:25326,57048:25378,57049:25334,57050:25401,57051:25419,57052:25411,57053:25517,57054:25590,57055:25457,57056:25466,57057:25486,57058:25524,57059:25453,57060:25516,57061:25482,57062:25449,57063:25518,57064:25532,57065:25586,57066:25592,57067:25568,57068:25599,57069:25540,57070:25566,57071:25550,57072:25682,57073:25542,57074:25534,57075:25669,57076:25665,57077:25611,57078:25627,57079:25632,57080:25612,57081:25638,57082:25633,57083:25694,57084:25732,57085:25709,57086:25750,57152:36889,57153:36892,57154:36899,57155:36900,57156:36901,57157:36903,57158:36904,57159:36905,57160:36906,57161:36907,57162:36908,57163:36912,57164:36913,57165:36914,57166:36915,57167:36916,57168:36919,57169:36921,57170:36922,57171:36925,57172:36927,57173:36928,57174:36931,57175:36933,57176:36934,57177:36936,57178:36937,57179:36938,57180:36939,57181:36940,57182:36942,57183:36948,57184:36949,57185:36950,57186:36953,57187:36954,57188:36956,57189:36957,57190:36958,57191:36959,57192:36960,57193:36961,57194:36964,57195:36966,57196:36967,57197:36969,57198:36970,57199:36971,57200:36972,57201:36975,57202:36976,57203:36977,57204:36978,57205:36979,57206:36982,57207:36983,57208:36984,57209:36985,57210:36986,57211:36987,57212:36988,57213:36990,57214:36993,57216:36996,57217:36997,57218:36998,57219:36999,57220:37001,57221:37002,57222:37004,57223:37005,57224:37006,57225:37007,57226:37008,57227:37010,57228:37012,57229:37014,57230:37016,57231:37018,57232:37020,57233:37022,57234:37023,57235:37024,57236:37028,57237:37029,57238:37031,57239:37032,57240:37033,57241:37035,57242:37037,57243:37042,57244:37047,57245:37052,57246:37053,57247:37055,57248:37056,57249:25722,57250:25783,57251:25784,57252:25753,57253:25786,57254:25792,57255:25808,57256:25815,57257:25828,57258:25826,57259:25865,57260:25893,57261:25902,57262:24331,57263:24530,57264:29977,57265:24337,57266:21343,57267:21489,57268:21501,57269:21481,57270:21480,57271:21499,57272:21522,57273:21526,57274:21510,57275:21579,57276:21586,57277:21587,57278:21588,57279:21590,57280:21571,57281:21537,57282:21591,57283:21593,57284:21539,57285:21554,57286:21634,57287:21652,57288:21623,57289:21617,57290:21604,57291:21658,57292:21659,57293:21636,57294:21622,57295:21606,57296:21661,57297:21712,57298:21677,57299:21698,57300:21684,57301:21714,57302:21671,57303:21670,57304:21715,57305:21716,57306:21618,57307:21667,57308:21717,57309:21691,57310:21695,57311:21708,57312:21721,57313:21722,57314:21724,57315:21673,57316:21674,57317:21668,57318:21725,57319:21711,57320:21726,57321:21787,57322:21735,57323:21792,57324:21757,57325:21780,57326:21747,57327:21794,57328:21795,57329:21775,57330:21777,57331:21799,57332:21802,57333:21863,57334:21903,57335:21941,57336:21833,57337:21869,57338:21825,57339:21845,57340:21823,57341:21840,57342:21820,57408:37058,57409:37059,57410:37062,57411:37064,57412:37065,57413:37067,57414:37068,57415:37069,57416:37074,57417:37076,57418:37077,57419:37078,57420:37080,57421:37081,57422:37082,57423:37086,57424:37087,57425:37088,57426:37091,57427:37092,57428:37093,57429:37097,57430:37098,57431:37100,57432:37102,57433:37104,57434:37105,57435:37106,57436:37107,57437:37109,57438:37110,57439:37111,57440:37113,57441:37114,57442:37115,57443:37116,57444:37119,57445:37120,57446:37121,57447:37123,57448:37125,57449:37126,57450:37127,57451:37128,57452:37129,57453:37130,57454:37131,57455:37132,57456:37133,57457:37134,57458:37135,57459:37136,57460:37137,57461:37138,57462:37139,57463:37140,57464:37141,57465:37142,57466:37143,57467:37144,57468:37146,57469:37147,57470:37148,57472:37149,57473:37151,57474:37152,57475:37153,57476:37156,57477:37157,57478:37158,57479:37159,57480:37160,57481:37161,57482:37162,57483:37163,57484:37164,57485:37165,57486:37166,57487:37168,57488:37170,57489:37171,57490:37172,57491:37173,57492:37174,57493:37175,57494:37176,57495:37178,57496:37179,57497:37180,57498:37181,57499:37182,57500:37183,57501:37184,57502:37185,57503:37186,57504:37188,57505:21815,57506:21846,57507:21877,57508:21878,57509:21879,57510:21811,57511:21808,57512:21852,57513:21899,57514:21970,57515:21891,57516:21937,57517:21945,57518:21896,57519:21889,57520:21919,57521:21886,57522:21974,57523:21905,57524:21883,57525:21983,57526:21949,57527:21950,57528:21908,57529:21913,57530:21994,57531:22007,57532:21961,57533:22047,57534:21969,57535:21995,57536:21996,57537:21972,57538:21990,57539:21981,57540:21956,57541:21999,57542:21989,57543:22002,57544:22003,57545:21964,57546:21965,57547:21992,57548:22005,57549:21988,57550:36756,57551:22046,57552:22024,57553:22028,57554:22017,57555:22052,57556:22051,57557:22014,57558:22016,57559:22055,57560:22061,57561:22104,57562:22073,57563:22103,57564:22060,57565:22093,57566:22114,57567:22105,57568:22108,57569:22092,57570:22100,57571:22150,57572:22116,57573:22129,57574:22123,57575:22139,57576:22140,57577:22149,57578:22163,57579:22191,57580:22228,57581:22231,57582:22237,57583:22241,57584:22261,57585:22251,57586:22265,57587:22271,57588:22276,57589:22282,57590:22281,57591:22300,57592:24079,57593:24089,57594:24084,57595:24081,57596:24113,57597:24123,57598:24124,57664:37189,57665:37191,57666:37192,57667:37201,57668:37203,57669:37204,57670:37205,57671:37206,57672:37208,57673:37209,57674:37211,57675:37212,57676:37215,57677:37216,57678:37222,57679:37223,57680:37224,57681:37227,57682:37229,57683:37235,57684:37242,57685:37243,57686:37244,57687:37248,57688:37249,57689:37250,57690:37251,57691:37252,57692:37254,57693:37256,57694:37258,57695:37262,57696:37263,57697:37267,57698:37268,57699:37269,57700:37270,57701:37271,57702:37272,57703:37273,57704:37276,57705:37277,57706:37278,57707:37279,57708:37280,57709:37281,57710:37284,57711:37285,57712:37286,57713:37287,57714:37288,57715:37289,57716:37291,57717:37292,57718:37296,57719:37297,57720:37298,57721:37299,57722:37302,57723:37303,57724:37304,57725:37305,57726:37307,57728:37308,57729:37309,57730:37310,57731:37311,57732:37312,57733:37313,57734:37314,57735:37315,57736:37316,57737:37317,57738:37318,57739:37320,57740:37323,57741:37328,57742:37330,57743:37331,57744:37332,57745:37333,57746:37334,57747:37335,57748:37336,57749:37337,57750:37338,57751:37339,57752:37341,57753:37342,57754:37343,57755:37344,57756:37345,57757:37346,57758:37347,57759:37348,57760:37349,57761:24119,57762:24132,57763:24148,57764:24155,57765:24158,57766:24161,57767:23692,57768:23674,57769:23693,57770:23696,57771:23702,57772:23688,57773:23704,57774:23705,57775:23697,57776:23706,57777:23708,57778:23733,57779:23714,57780:23741,57781:23724,57782:23723,57783:23729,57784:23715,57785:23745,57786:23735,57787:23748,57788:23762,57789:23780,57790:23755,57791:23781,57792:23810,57793:23811,57794:23847,57795:23846,57796:23854,57797:23844,57798:23838,57799:23814,57800:23835,57801:23896,57802:23870,57803:23860,57804:23869,57805:23916,57806:23899,57807:23919,57808:23901,57809:23915,57810:23883,57811:23882,57812:23913,57813:23924,57814:23938,57815:23961,57816:23965,57817:35955,57818:23991,57819:24005,57820:24435,57821:24439,57822:24450,57823:24455,57824:24457,57825:24460,57826:24469,57827:24473,57828:24476,57829:24488,57830:24493,57831:24501,57832:24508,57833:34914,57834:24417,57835:29357,57836:29360,57837:29364,57838:29367,57839:29368,57840:29379,57841:29377,57842:29390,57843:29389,57844:29394,57845:29416,57846:29423,57847:29417,57848:29426,57849:29428,57850:29431,57851:29441,57852:29427,57853:29443,57854:29434,57920:37350,57921:37351,57922:37352,57923:37353,57924:37354,57925:37355,57926:37356,57927:37357,57928:37358,57929:37359,57930:37360,57931:37361,57932:37362,57933:37363,57934:37364,57935:37365,57936:37366,57937:37367,57938:37368,57939:37369,57940:37370,57941:37371,57942:37372,57943:37373,57944:37374,57945:37375,57946:37376,57947:37377,57948:37378,57949:37379,57950:37380,57951:37381,57952:37382,57953:37383,57954:37384,57955:37385,57956:37386,57957:37387,57958:37388,57959:37389,57960:37390,57961:37391,57962:37392,57963:37393,57964:37394,57965:37395,57966:37396,57967:37397,57968:37398,57969:37399,57970:37400,57971:37401,57972:37402,57973:37403,57974:37404,57975:37405,57976:37406,57977:37407,57978:37408,57979:37409,57980:37410,57981:37411,57982:37412,57984:37413,57985:37414,57986:37415,57987:37416,57988:37417,57989:37418,57990:37419,57991:37420,57992:37421,57993:37422,57994:37423,57995:37424,57996:37425,57997:37426,57998:37427,57999:37428,58000:37429,58001:37430,58002:37431,58003:37432,58004:37433,58005:37434,58006:37435,58007:37436,58008:37437,58009:37438,58010:37439,58011:37440,58012:37441,58013:37442,58014:37443,58015:37444,58016:37445,58017:29435,58018:29463,58019:29459,58020:29473,58021:29450,58022:29470,58023:29469,58024:29461,58025:29474,58026:29497,58027:29477,58028:29484,58029:29496,58030:29489,58031:29520,58032:29517,58033:29527,58034:29536,58035:29548,58036:29551,58037:29566,58038:33307,58039:22821,58040:39143,58041:22820,58042:22786,58043:39267,58044:39271,58045:39272,58046:39273,58047:39274,58048:39275,58049:39276,58050:39284,58051:39287,58052:39293,58053:39296,58054:39300,58055:39303,58056:39306,58057:39309,58058:39312,58059:39313,58060:39315,58061:39316,58062:39317,58063:24192,58064:24209,58065:24203,58066:24214,58067:24229,58068:24224,58069:24249,58070:24245,58071:24254,58072:24243,58073:36179,58074:24274,58075:24273,58076:24283,58077:24296,58078:24298,58079:33210,58080:24516,58081:24521,58082:24534,58083:24527,58084:24579,58085:24558,58086:24580,58087:24545,58088:24548,58089:24574,58090:24581,58091:24582,58092:24554,58093:24557,58094:24568,58095:24601,58096:24629,58097:24614,58098:24603,58099:24591,58100:24589,58101:24617,58102:24619,58103:24586,58104:24639,58105:24609,58106:24696,58107:24697,58108:24699,58109:24698,58110:24642,58176:37446,58177:37447,58178:37448,58179:37449,58180:37450,58181:37451,58182:37452,58183:37453,58184:37454,58185:37455,58186:37456,58187:37457,58188:37458,58189:37459,58190:37460,58191:37461,58192:37462,58193:37463,58194:37464,58195:37465,58196:37466,58197:37467,58198:37468,58199:37469,58200:37470,58201:37471,58202:37472,58203:37473,58204:37474,58205:37475,58206:37476,58207:37477,58208:37478,58209:37479,58210:37480,58211:37481,58212:37482,58213:37483,58214:37484,58215:37485,58216:37486,58217:37487,58218:37488,58219:37489,58220:37490,58221:37491,58222:37493,58223:37494,58224:37495,58225:37496,58226:37497,58227:37498,58228:37499,58229:37500,58230:37501,58231:37502,58232:37503,58233:37504,58234:37505,58235:37506,58236:37507,58237:37508,58238:37509,58240:37510,58241:37511,58242:37512,58243:37513,58244:37514,58245:37515,58246:37516,58247:37517,58248:37519,58249:37520,58250:37521,58251:37522,58252:37523,58253:37524,58254:37525,58255:37526,58256:37527,58257:37528,58258:37529,58259:37530,58260:37531,58261:37532,58262:37533,58263:37534,58264:37535,58265:37536,58266:37537,58267:37538,58268:37539,58269:37540,58270:37541,58271:37542,58272:37543,58273:24682,58274:24701,58275:24726,58276:24730,58277:24749,58278:24733,58279:24707,58280:24722,58281:24716,58282:24731,58283:24812,58284:24763,58285:24753,58286:24797,58287:24792,58288:24774,58289:24794,58290:24756,58291:24864,58292:24870,58293:24853,58294:24867,58295:24820,58296:24832,58297:24846,58298:24875,58299:24906,58300:24949,58301:25004,58302:24980,58303:24999,58304:25015,58305:25044,58306:25077,58307:24541,58308:38579,58309:38377,58310:38379,58311:38385,58312:38387,58313:38389,58314:38390,58315:38396,58316:38398,58317:38403,58318:38404,58319:38406,58320:38408,58321:38410,58322:38411,58323:38412,58324:38413,58325:38415,58326:38418,58327:38421,58328:38422,58329:38423,58330:38425,58331:38426,58332:20012,58333:29247,58334:25109,58335:27701,58336:27732,58337:27740,58338:27722,58339:27811,58340:27781,58341:27792,58342:27796,58343:27788,58344:27752,58345:27753,58346:27764,58347:27766,58348:27782,58349:27817,58350:27856,58351:27860,58352:27821,58353:27895,58354:27896,58355:27889,58356:27863,58357:27826,58358:27872,58359:27862,58360:27898,58361:27883,58362:27886,58363:27825,58364:27859,58365:27887,58366:27902,58432:37544,58433:37545,58434:37546,58435:37547,58436:37548,58437:37549,58438:37551,58439:37552,58440:37553,58441:37554,58442:37555,58443:37556,58444:37557,58445:37558,58446:37559,58447:37560,58448:37561,58449:37562,58450:37563,58451:37564,58452:37565,58453:37566,58454:37567,58455:37568,58456:37569,58457:37570,58458:37571,58459:37572,58460:37573,58461:37574,58462:37575,58463:37577,58464:37578,58465:37579,58466:37580,58467:37581,58468:37582,58469:37583,58470:37584,58471:37585,58472:37586,58473:37587,58474:37588,58475:37589,58476:37590,58477:37591,58478:37592,58479:37593,58480:37594,58481:37595,58482:37596,58483:37597,58484:37598,58485:37599,58486:37600,58487:37601,58488:37602,58489:37603,58490:37604,58491:37605,58492:37606,58493:37607,58494:37608,58496:37609,58497:37610,58498:37611,58499:37612,58500:37613,58501:37614,58502:37615,58503:37616,58504:37617,58505:37618,58506:37619,58507:37620,58508:37621,58509:37622,58510:37623,58511:37624,58512:37625,58513:37626,58514:37627,58515:37628,58516:37629,58517:37630,58518:37631,58519:37632,58520:37633,58521:37634,58522:37635,58523:37636,58524:37637,58525:37638,58526:37639,58527:37640,58528:37641,58529:27961,58530:27943,58531:27916,58532:27971,58533:27976,58534:27911,58535:27908,58536:27929,58537:27918,58538:27947,58539:27981,58540:27950,58541:27957,58542:27930,58543:27983,58544:27986,58545:27988,58546:27955,58547:28049,58548:28015,58549:28062,58550:28064,58551:27998,58552:28051,58553:28052,58554:27996,58555:28000,58556:28028,58557:28003,58558:28186,58559:28103,58560:28101,58561:28126,58562:28174,58563:28095,58564:28128,58565:28177,58566:28134,58567:28125,58568:28121,58569:28182,58570:28075,58571:28172,58572:28078,58573:28203,58574:28270,58575:28238,58576:28267,58577:28338,58578:28255,58579:28294,58580:28243,58581:28244,58582:28210,58583:28197,58584:28228,58585:28383,58586:28337,58587:28312,58588:28384,58589:28461,58590:28386,58591:28325,58592:28327,58593:28349,58594:28347,58595:28343,58596:28375,58597:28340,58598:28367,58599:28303,58600:28354,58601:28319,58602:28514,58603:28486,58604:28487,58605:28452,58606:28437,58607:28409,58608:28463,58609:28470,58610:28491,58611:28532,58612:28458,58613:28425,58614:28457,58615:28553,58616:28557,58617:28556,58618:28536,58619:28530,58620:28540,58621:28538,58622:28625,58688:37642,58689:37643,58690:37644,58691:37645,58692:37646,58693:37647,58694:37648,58695:37649,58696:37650,58697:37651,58698:37652,58699:37653,58700:37654,58701:37655,58702:37656,58703:37657,58704:37658,58705:37659,58706:37660,58707:37661,58708:37662,58709:37663,58710:37664,58711:37665,58712:37666,58713:37667,58714:37668,58715:37669,58716:37670,58717:37671,58718:37672,58719:37673,58720:37674,58721:37675,58722:37676,58723:37677,58724:37678,58725:37679,58726:37680,58727:37681,58728:37682,58729:37683,58730:37684,58731:37685,58732:37686,58733:37687,58734:37688,58735:37689,58736:37690,58737:37691,58738:37692,58739:37693,58740:37695,58741:37696,58742:37697,58743:37698,58744:37699,58745:37700,58746:37701,58747:37702,58748:37703,58749:37704,58750:37705,58752:37706,58753:37707,58754:37708,58755:37709,58756:37710,58757:37711,58758:37712,58759:37713,58760:37714,58761:37715,58762:37716,58763:37717,58764:37718,58765:37719,58766:37720,58767:37721,58768:37722,58769:37723,58770:37724,58771:37725,58772:37726,58773:37727,58774:37728,58775:37729,58776:37730,58777:37731,58778:37732,58779:37733,58780:37734,58781:37735,58782:37736,58783:37737,58784:37739,58785:28617,58786:28583,58787:28601,58788:28598,58789:28610,58790:28641,58791:28654,58792:28638,58793:28640,58794:28655,58795:28698,58796:28707,58797:28699,58798:28729,58799:28725,58800:28751,58801:28766,58802:23424,58803:23428,58804:23445,58805:23443,58806:23461,58807:23480,58808:29999,58809:39582,58810:25652,58811:23524,58812:23534,58813:35120,58814:23536,58815:36423,58816:35591,58817:36790,58818:36819,58819:36821,58820:36837,58821:36846,58822:36836,58823:36841,58824:36838,58825:36851,58826:36840,58827:36869,58828:36868,58829:36875,58830:36902,58831:36881,58832:36877,58833:36886,58834:36897,58835:36917,58836:36918,58837:36909,58838:36911,58839:36932,58840:36945,58841:36946,58842:36944,58843:36968,58844:36952,58845:36962,58846:36955,58847:26297,58848:36980,58849:36989,58850:36994,58851:37000,58852:36995,58853:37003,58854:24400,58855:24407,58856:24406,58857:24408,58858:23611,58859:21675,58860:23632,58861:23641,58862:23409,58863:23651,58864:23654,58865:32700,58866:24362,58867:24361,58868:24365,58869:33396,58870:24380,58871:39739,58872:23662,58873:22913,58874:22915,58875:22925,58876:22953,58877:22954,58878:22947,58944:37740,58945:37741,58946:37742,58947:37743,58948:37744,58949:37745,58950:37746,58951:37747,58952:37748,58953:37749,58954:37750,58955:37751,58956:37752,58957:37753,58958:37754,58959:37755,58960:37756,58961:37757,58962:37758,58963:37759,58964:37760,58965:37761,58966:37762,58967:37763,58968:37764,58969:37765,58970:37766,58971:37767,58972:37768,58973:37769,58974:37770,58975:37771,58976:37772,58977:37773,58978:37774,58979:37776,58980:37777,58981:37778,58982:37779,58983:37780,58984:37781,58985:37782,58986:37783,58987:37784,58988:37785,58989:37786,58990:37787,58991:37788,58992:37789,58993:37790,58994:37791,58995:37792,58996:37793,58997:37794,58998:37795,58999:37796,59000:37797,59001:37798,59002:37799,59003:37800,59004:37801,59005:37802,59006:37803,59008:37804,59009:37805,59010:37806,59011:37807,59012:37808,59013:37809,59014:37810,59015:37811,59016:37812,59017:37813,59018:37814,59019:37815,59020:37816,59021:37817,59022:37818,59023:37819,59024:37820,59025:37821,59026:37822,59027:37823,59028:37824,59029:37825,59030:37826,59031:37827,59032:37828,59033:37829,59034:37830,59035:37831,59036:37832,59037:37833,59038:37835,59039:37836,59040:37837,59041:22935,59042:22986,59043:22955,59044:22942,59045:22948,59046:22994,59047:22962,59048:22959,59049:22999,59050:22974,59051:23045,59052:23046,59053:23005,59054:23048,59055:23011,59056:23000,59057:23033,59058:23052,59059:23049,59060:23090,59061:23092,59062:23057,59063:23075,59064:23059,59065:23104,59066:23143,59067:23114,59068:23125,59069:23100,59070:23138,59071:23157,59072:33004,59073:23210,59074:23195,59075:23159,59076:23162,59077:23230,59078:23275,59079:23218,59080:23250,59081:23252,59082:23224,59083:23264,59084:23267,59085:23281,59086:23254,59087:23270,59088:23256,59089:23260,59090:23305,59091:23319,59092:23318,59093:23346,59094:23351,59095:23360,59096:23573,59097:23580,59098:23386,59099:23397,59100:23411,59101:23377,59102:23379,59103:23394,59104:39541,59105:39543,59106:39544,59107:39546,59108:39551,59109:39549,59110:39552,59111:39553,59112:39557,59113:39560,59114:39562,59115:39568,59116:39570,59117:39571,59118:39574,59119:39576,59120:39579,59121:39580,59122:39581,59123:39583,59124:39584,59125:39586,59126:39587,59127:39589,59128:39591,59129:32415,59130:32417,59131:32419,59132:32421,59133:32424,59134:32425,59200:37838,59201:37839,59202:37840,59203:37841,59204:37842,59205:37843,59206:37844,59207:37845,59208:37847,59209:37848,59210:37849,59211:37850,59212:37851,59213:37852,59214:37853,59215:37854,59216:37855,59217:37856,59218:37857,59219:37858,59220:37859,59221:37860,59222:37861,59223:37862,59224:37863,59225:37864,59226:37865,59227:37866,59228:37867,59229:37868,59230:37869,59231:37870,59232:37871,59233:37872,59234:37873,59235:37874,59236:37875,59237:37876,59238:37877,59239:37878,59240:37879,59241:37880,59242:37881,59243:37882,59244:37883,59245:37884,59246:37885,59247:37886,59248:37887,59249:37888,59250:37889,59251:37890,59252:37891,59253:37892,59254:37893,59255:37894,59256:37895,59257:37896,59258:37897,59259:37898,59260:37899,59261:37900,59262:37901,59264:37902,59265:37903,59266:37904,59267:37905,59268:37906,59269:37907,59270:37908,59271:37909,59272:37910,59273:37911,59274:37912,59275:37913,59276:37914,59277:37915,59278:37916,59279:37917,59280:37918,59281:37919,59282:37920,59283:37921,59284:37922,59285:37923,59286:37924,59287:37925,59288:37926,59289:37927,59290:37928,59291:37929,59292:37930,59293:37931,59294:37932,59295:37933,59296:37934,59297:32429,59298:32432,59299:32446,59300:32448,59301:32449,59302:32450,59303:32457,59304:32459,59305:32460,59306:32464,59307:32468,59308:32471,59309:32475,59310:32480,59311:32481,59312:32488,59313:32491,59314:32494,59315:32495,59316:32497,59317:32498,59318:32525,59319:32502,59320:32506,59321:32507,59322:32510,59323:32513,59324:32514,59325:32515,59326:32519,59327:32520,59328:32523,59329:32524,59330:32527,59331:32529,59332:32530,59333:32535,59334:32537,59335:32540,59336:32539,59337:32543,59338:32545,59339:32546,59340:32547,59341:32548,59342:32549,59343:32550,59344:32551,59345:32554,59346:32555,59347:32556,59348:32557,59349:32559,59350:32560,59351:32561,59352:32562,59353:32563,59354:32565,59355:24186,59356:30079,59357:24027,59358:30014,59359:37013,59360:29582,59361:29585,59362:29614,59363:29602,59364:29599,59365:29647,59366:29634,59367:29649,59368:29623,59369:29619,59370:29632,59371:29641,59372:29640,59373:29669,59374:29657,59375:39036,59376:29706,59377:29673,59378:29671,59379:29662,59380:29626,59381:29682,59382:29711,59383:29738,59384:29787,59385:29734,59386:29733,59387:29736,59388:29744,59389:29742,59390:29740,59456:37935,59457:37936,59458:37937,59459:37938,59460:37939,59461:37940,59462:37941,59463:37942,59464:37943,59465:37944,59466:37945,59467:37946,59468:37947,59469:37948,59470:37949,59471:37951,59472:37952,59473:37953,59474:37954,59475:37955,59476:37956,59477:37957,59478:37958,59479:37959,59480:37960,59481:37961,59482:37962,59483:37963,59484:37964,59485:37965,59486:37966,59487:37967,59488:37968,59489:37969,59490:37970,59491:37971,59492:37972,59493:37973,59494:37974,59495:37975,59496:37976,59497:37977,59498:37978,59499:37979,59500:37980,59501:37981,59502:37982,59503:37983,59504:37984,59505:37985,59506:37986,59507:37987,59508:37988,59509:37989,59510:37990,59511:37991,59512:37992,59513:37993,59514:37994,59515:37996,59516:37997,59517:37998,59518:37999,59520:38000,59521:38001,59522:38002,59523:38003,59524:38004,59525:38005,59526:38006,59527:38007,59528:38008,59529:38009,59530:38010,59531:38011,59532:38012,59533:38013,59534:38014,59535:38015,59536:38016,59537:38017,59538:38018,59539:38019,59540:38020,59541:38033,59542:38038,59543:38040,59544:38087,59545:38095,59546:38099,59547:38100,59548:38106,59549:38118,59550:38139,59551:38172,59552:38176,59553:29723,59554:29722,59555:29761,59556:29788,59557:29783,59558:29781,59559:29785,59560:29815,59561:29805,59562:29822,59563:29852,59564:29838,59565:29824,59566:29825,59567:29831,59568:29835,59569:29854,59570:29864,59571:29865,59572:29840,59573:29863,59574:29906,59575:29882,59576:38890,59577:38891,59578:38892,59579:26444,59580:26451,59581:26462,59582:26440,59583:26473,59584:26533,59585:26503,59586:26474,59587:26483,59588:26520,59589:26535,59590:26485,59591:26536,59592:26526,59593:26541,59594:26507,59595:26487,59596:26492,59597:26608,59598:26633,59599:26584,59600:26634,59601:26601,59602:26544,59603:26636,59604:26585,59605:26549,59606:26586,59607:26547,59608:26589,59609:26624,59610:26563,59611:26552,59612:26594,59613:26638,59614:26561,59615:26621,59616:26674,59617:26675,59618:26720,59619:26721,59620:26702,59621:26722,59622:26692,59623:26724,59624:26755,59625:26653,59626:26709,59627:26726,59628:26689,59629:26727,59630:26688,59631:26686,59632:26698,59633:26697,59634:26665,59635:26805,59636:26767,59637:26740,59638:26743,59639:26771,59640:26731,59641:26818,59642:26990,59643:26876,59644:26911,59645:26912,59646:26873,59712:38183,59713:38195,59714:38205,59715:38211,59716:38216,59717:38219,59718:38229,59719:38234,59720:38240,59721:38254,59722:38260,59723:38261,59724:38263,59725:38264,59726:38265,59727:38266,59728:38267,59729:38268,59730:38269,59731:38270,59732:38272,59733:38273,59734:38274,59735:38275,59736:38276,59737:38277,59738:38278,59739:38279,59740:38280,59741:38281,59742:38282,59743:38283,59744:38284,59745:38285,59746:38286,59747:38287,59748:38288,59749:38289,59750:38290,59751:38291,59752:38292,59753:38293,59754:38294,59755:38295,59756:38296,59757:38297,59758:38298,59759:38299,59760:38300,59761:38301,59762:38302,59763:38303,59764:38304,59765:38305,59766:38306,59767:38307,59768:38308,59769:38309,59770:38310,59771:38311,59772:38312,59773:38313,59774:38314,59776:38315,59777:38316,59778:38317,59779:38318,59780:38319,59781:38320,59782:38321,59783:38322,59784:38323,59785:38324,59786:38325,59787:38326,59788:38327,59789:38328,59790:38329,59791:38330,59792:38331,59793:38332,59794:38333,59795:38334,59796:38335,59797:38336,59798:38337,59799:38338,59800:38339,59801:38340,59802:38341,59803:38342,59804:38343,59805:38344,59806:38345,59807:38346,59808:38347,59809:26916,59810:26864,59811:26891,59812:26881,59813:26967,59814:26851,59815:26896,59816:26993,59817:26937,59818:26976,59819:26946,59820:26973,59821:27012,59822:26987,59823:27008,59824:27032,59825:27000,59826:26932,59827:27084,59828:27015,59829:27016,59830:27086,59831:27017,59832:26982,59833:26979,59834:27001,59835:27035,59836:27047,59837:27067,59838:27051,59839:27053,59840:27092,59841:27057,59842:27073,59843:27082,59844:27103,59845:27029,59846:27104,59847:27021,59848:27135,59849:27183,59850:27117,59851:27159,59852:27160,59853:27237,59854:27122,59855:27204,59856:27198,59857:27296,59858:27216,59859:27227,59860:27189,59861:27278,59862:27257,59863:27197,59864:27176,59865:27224,59866:27260,59867:27281,59868:27280,59869:27305,59870:27287,59871:27307,59872:29495,59873:29522,59874:27521,59875:27522,59876:27527,59877:27524,59878:27538,59879:27539,59880:27533,59881:27546,59882:27547,59883:27553,59884:27562,59885:36715,59886:36717,59887:36721,59888:36722,59889:36723,59890:36725,59891:36726,59892:36728,59893:36727,59894:36729,59895:36730,59896:36732,59897:36734,59898:36737,59899:36738,59900:36740,59901:36743,59902:36747,59968:38348,59969:38349,59970:38350,59971:38351,59972:38352,59973:38353,59974:38354,59975:38355,59976:38356,59977:38357,59978:38358,59979:38359,59980:38360,59981:38361,59982:38362,59983:38363,59984:38364,59985:38365,59986:38366,59987:38367,59988:38368,59989:38369,59990:38370,59991:38371,59992:38372,59993:38373,59994:38374,59995:38375,59996:38380,59997:38399,59998:38407,59999:38419,60000:38424,60001:38427,60002:38430,60003:38432,60004:38435,60005:38436,60006:38437,60007:38438,60008:38439,60009:38440,60010:38441,60011:38443,60012:38444,60013:38445,60014:38447,60015:38448,60016:38455,60017:38456,60018:38457,60019:38458,60020:38462,60021:38465,60022:38467,60023:38474,60024:38478,60025:38479,60026:38481,60027:38482,60028:38483,60029:38486,60030:38487,60032:38488,60033:38489,60034:38490,60035:38492,60036:38493,60037:38494,60038:38496,60039:38499,60040:38501,60041:38502,60042:38507,60043:38509,60044:38510,60045:38511,60046:38512,60047:38513,60048:38515,60049:38520,60050:38521,60051:38522,60052:38523,60053:38524,60054:38525,60055:38526,60056:38527,60057:38528,60058:38529,60059:38530,60060:38531,60061:38532,60062:38535,60063:38537,60064:38538,60065:36749,60066:36750,60067:36751,60068:36760,60069:36762,60070:36558,60071:25099,60072:25111,60073:25115,60074:25119,60075:25122,60076:25121,60077:25125,60078:25124,60079:25132,60080:33255,60081:29935,60082:29940,60083:29951,60084:29967,60085:29969,60086:29971,60087:25908,60088:26094,60089:26095,60090:26096,60091:26122,60092:26137,60093:26482,60094:26115,60095:26133,60096:26112,60097:28805,60098:26359,60099:26141,60100:26164,60101:26161,60102:26166,60103:26165,60104:32774,60105:26207,60106:26196,60107:26177,60108:26191,60109:26198,60110:26209,60111:26199,60112:26231,60113:26244,60114:26252,60115:26279,60116:26269,60117:26302,60118:26331,60119:26332,60120:26342,60121:26345,60122:36146,60123:36147,60124:36150,60125:36155,60126:36157,60127:36160,60128:36165,60129:36166,60130:36168,60131:36169,60132:36167,60133:36173,60134:36181,60135:36185,60136:35271,60137:35274,60138:35275,60139:35276,60140:35278,60141:35279,60142:35280,60143:35281,60144:29294,60145:29343,60146:29277,60147:29286,60148:29295,60149:29310,60150:29311,60151:29316,60152:29323,60153:29325,60154:29327,60155:29330,60156:25352,60157:25394,60158:25520,60224:38540,60225:38542,60226:38545,60227:38546,60228:38547,60229:38549,60230:38550,60231:38554,60232:38555,60233:38557,60234:38558,60235:38559,60236:38560,60237:38561,60238:38562,60239:38563,60240:38564,60241:38565,60242:38566,60243:38568,60244:38569,60245:38570,60246:38571,60247:38572,60248:38573,60249:38574,60250:38575,60251:38577,60252:38578,60253:38580,60254:38581,60255:38583,60256:38584,60257:38586,60258:38587,60259:38591,60260:38594,60261:38595,60262:38600,60263:38602,60264:38603,60265:38608,60266:38609,60267:38611,60268:38612,60269:38614,60270:38615,60271:38616,60272:38617,60273:38618,60274:38619,60275:38620,60276:38621,60277:38622,60278:38623,60279:38625,60280:38626,60281:38627,60282:38628,60283:38629,60284:38630,60285:38631,60286:38635,60288:38636,60289:38637,60290:38638,60291:38640,60292:38641,60293:38642,60294:38644,60295:38645,60296:38648,60297:38650,60298:38651,60299:38652,60300:38653,60301:38655,60302:38658,60303:38659,60304:38661,60305:38666,60306:38667,60307:38668,60308:38672,60309:38673,60310:38674,60311:38676,60312:38677,60313:38679,60314:38680,60315:38681,60316:38682,60317:38683,60318:38685,60319:38687,60320:38688,60321:25663,60322:25816,60323:32772,60324:27626,60325:27635,60326:27645,60327:27637,60328:27641,60329:27653,60330:27655,60331:27654,60332:27661,60333:27669,60334:27672,60335:27673,60336:27674,60337:27681,60338:27689,60339:27684,60340:27690,60341:27698,60342:25909,60343:25941,60344:25963,60345:29261,60346:29266,60347:29270,60348:29232,60349:34402,60350:21014,60351:32927,60352:32924,60353:32915,60354:32956,60355:26378,60356:32957,60357:32945,60358:32939,60359:32941,60360:32948,60361:32951,60362:32999,60363:33000,60364:33001,60365:33002,60366:32987,60367:32962,60368:32964,60369:32985,60370:32973,60371:32983,60372:26384,60373:32989,60374:33003,60375:33009,60376:33012,60377:33005,60378:33037,60379:33038,60380:33010,60381:33020,60382:26389,60383:33042,60384:35930,60385:33078,60386:33054,60387:33068,60388:33048,60389:33074,60390:33096,60391:33100,60392:33107,60393:33140,60394:33113,60395:33114,60396:33137,60397:33120,60398:33129,60399:33148,60400:33149,60401:33133,60402:33127,60403:22605,60404:23221,60405:33160,60406:33154,60407:33169,60408:28373,60409:33187,60410:33194,60411:33228,60412:26406,60413:33226,60414:33211,60480:38689,60481:38690,60482:38691,60483:38692,60484:38693,60485:38694,60486:38695,60487:38696,60488:38697,60489:38699,60490:38700,60491:38702,60492:38703,60493:38705,60494:38707,60495:38708,60496:38709,60497:38710,60498:38711,60499:38714,60500:38715,60501:38716,60502:38717,60503:38719,60504:38720,60505:38721,60506:38722,60507:38723,60508:38724,60509:38725,60510:38726,60511:38727,60512:38728,60513:38729,60514:38730,60515:38731,60516:38732,60517:38733,60518:38734,60519:38735,60520:38736,60521:38737,60522:38740,60523:38741,60524:38743,60525:38744,60526:38746,60527:38748,60528:38749,60529:38751,60530:38755,60531:38756,60532:38758,60533:38759,60534:38760,60535:38762,60536:38763,60537:38764,60538:38765,60539:38766,60540:38767,60541:38768,60542:38769,60544:38770,60545:38773,60546:38775,60547:38776,60548:38777,60549:38778,60550:38779,60551:38781,60552:38782,60553:38783,60554:38784,60555:38785,60556:38786,60557:38787,60558:38788,60559:38790,60560:38791,60561:38792,60562:38793,60563:38794,60564:38796,60565:38798,60566:38799,60567:38800,60568:38803,60569:38805,60570:38806,60571:38807,60572:38809,60573:38810,60574:38811,60575:38812,60576:38813,60577:33217,60578:33190,60579:27428,60580:27447,60581:27449,60582:27459,60583:27462,60584:27481,60585:39121,60586:39122,60587:39123,60588:39125,60589:39129,60590:39130,60591:27571,60592:24384,60593:27586,60594:35315,60595:26000,60596:40785,60597:26003,60598:26044,60599:26054,60600:26052,60601:26051,60602:26060,60603:26062,60604:26066,60605:26070,60606:28800,60607:28828,60608:28822,60609:28829,60610:28859,60611:28864,60612:28855,60613:28843,60614:28849,60615:28904,60616:28874,60617:28944,60618:28947,60619:28950,60620:28975,60621:28977,60622:29043,60623:29020,60624:29032,60625:28997,60626:29042,60627:29002,60628:29048,60629:29050,60630:29080,60631:29107,60632:29109,60633:29096,60634:29088,60635:29152,60636:29140,60637:29159,60638:29177,60639:29213,60640:29224,60641:28780,60642:28952,60643:29030,60644:29113,60645:25150,60646:25149,60647:25155,60648:25160,60649:25161,60650:31035,60651:31040,60652:31046,60653:31049,60654:31067,60655:31068,60656:31059,60657:31066,60658:31074,60659:31063,60660:31072,60661:31087,60662:31079,60663:31098,60664:31109,60665:31114,60666:31130,60667:31143,60668:31155,60669:24529,60670:24528,60736:38814,60737:38815,60738:38817,60739:38818,60740:38820,60741:38821,60742:38822,60743:38823,60744:38824,60745:38825,60746:38826,60747:38828,60748:38830,60749:38832,60750:38833,60751:38835,60752:38837,60753:38838,60754:38839,60755:38840,60756:38841,60757:38842,60758:38843,60759:38844,60760:38845,60761:38846,60762:38847,60763:38848,60764:38849,60765:38850,60766:38851,60767:38852,60768:38853,60769:38854,60770:38855,60771:38856,60772:38857,60773:38858,60774:38859,60775:38860,60776:38861,60777:38862,60778:38863,60779:38864,60780:38865,60781:38866,60782:38867,60783:38868,60784:38869,60785:38870,60786:38871,60787:38872,60788:38873,60789:38874,60790:38875,60791:38876,60792:38877,60793:38878,60794:38879,60795:38880,60796:38881,60797:38882,60798:38883,60800:38884,60801:38885,60802:38888,60803:38894,60804:38895,60805:38896,60806:38897,60807:38898,60808:38900,60809:38903,60810:38904,60811:38905,60812:38906,60813:38907,60814:38908,60815:38909,60816:38910,60817:38911,60818:38912,60819:38913,60820:38914,60821:38915,60822:38916,60823:38917,60824:38918,60825:38919,60826:38920,60827:38921,60828:38922,60829:38923,60830:38924,60831:38925,60832:38926,60833:24636,60834:24669,60835:24666,60836:24679,60837:24641,60838:24665,60839:24675,60840:24747,60841:24838,60842:24845,60843:24925,60844:25001,60845:24989,60846:25035,60847:25041,60848:25094,60849:32896,60850:32895,60851:27795,60852:27894,60853:28156,60854:30710,60855:30712,60856:30720,60857:30729,60858:30743,60859:30744,60860:30737,60861:26027,60862:30765,60863:30748,60864:30749,60865:30777,60866:30778,60867:30779,60868:30751,60869:30780,60870:30757,60871:30764,60872:30755,60873:30761,60874:30798,60875:30829,60876:30806,60877:30807,60878:30758,60879:30800,60880:30791,60881:30796,60882:30826,60883:30875,60884:30867,60885:30874,60886:30855,60887:30876,60888:30881,60889:30883,60890:30898,60891:30905,60892:30885,60893:30932,60894:30937,60895:30921,60896:30956,60897:30962,60898:30981,60899:30964,60900:30995,60901:31012,60902:31006,60903:31028,60904:40859,60905:40697,60906:40699,60907:40700,60908:30449,60909:30468,60910:30477,60911:30457,60912:30471,60913:30472,60914:30490,60915:30498,60916:30489,60917:30509,60918:30502,60919:30517,60920:30520,60921:30544,60922:30545,60923:30535,60924:30531,60925:30554,60926:30568,60992:38927,60993:38928,60994:38929,60995:38930,60996:38931,60997:38932,60998:38933,60999:38934,61000:38935,61001:38936,61002:38937,61003:38938,61004:38939,61005:38940,61006:38941,61007:38942,61008:38943,61009:38944,61010:38945,61011:38946,61012:38947,61013:38948,61014:38949,61015:38950,61016:38951,61017:38952,61018:38953,61019:38954,61020:38955,61021:38956,61022:38957,61023:38958,61024:38959,61025:38960,61026:38961,61027:38962,61028:38963,61029:38964,61030:38965,61031:38966,61032:38967,61033:38968,61034:38969,61035:38970,61036:38971,61037:38972,61038:38973,61039:38974,61040:38975,61041:38976,61042:38977,61043:38978,61044:38979,61045:38980,61046:38981,61047:38982,61048:38983,61049:38984,61050:38985,61051:38986,61052:38987,61053:38988,61054:38989,61056:38990,61057:38991,61058:38992,61059:38993,61060:38994,61061:38995,61062:38996,61063:38997,61064:38998,61065:38999,61066:39000,61067:39001,61068:39002,61069:39003,61070:39004,61071:39005,61072:39006,61073:39007,61074:39008,61075:39009,61076:39010,61077:39011,61078:39012,61079:39013,61080:39014,61081:39015,61082:39016,61083:39017,61084:39018,61085:39019,61086:39020,61087:39021,61088:39022,61089:30562,61090:30565,61091:30591,61092:30605,61093:30589,61094:30592,61095:30604,61096:30609,61097:30623,61098:30624,61099:30640,61100:30645,61101:30653,61102:30010,61103:30016,61104:30030,61105:30027,61106:30024,61107:30043,61108:30066,61109:30073,61110:30083,61111:32600,61112:32609,61113:32607,61114:35400,61115:32616,61116:32628,61117:32625,61118:32633,61119:32641,61120:32638,61121:30413,61122:30437,61123:34866,61124:38021,61125:38022,61126:38023,61127:38027,61128:38026,61129:38028,61130:38029,61131:38031,61132:38032,61133:38036,61134:38039,61135:38037,61136:38042,61137:38043,61138:38044,61139:38051,61140:38052,61141:38059,61142:38058,61143:38061,61144:38060,61145:38063,61146:38064,61147:38066,61148:38068,61149:38070,61150:38071,61151:38072,61152:38073,61153:38074,61154:38076,61155:38077,61156:38079,61157:38084,61158:38088,61159:38089,61160:38090,61161:38091,61162:38092,61163:38093,61164:38094,61165:38096,61166:38097,61167:38098,61168:38101,61169:38102,61170:38103,61171:38105,61172:38104,61173:38107,61174:38110,61175:38111,61176:38112,61177:38114,61178:38116,61179:38117,61180:38119,61181:38120,61182:38122,61248:39023,61249:39024,61250:39025,61251:39026,61252:39027,61253:39028,61254:39051,61255:39054,61256:39058,61257:39061,61258:39065,61259:39075,61260:39080,61261:39081,61262:39082,61263:39083,61264:39084,61265:39085,61266:39086,61267:39087,61268:39088,61269:39089,61270:39090,61271:39091,61272:39092,61273:39093,61274:39094,61275:39095,61276:39096,61277:39097,61278:39098,61279:39099,61280:39100,61281:39101,61282:39102,61283:39103,61284:39104,61285:39105,61286:39106,61287:39107,61288:39108,61289:39109,61290:39110,61291:39111,61292:39112,61293:39113,61294:39114,61295:39115,61296:39116,61297:39117,61298:39119,61299:39120,61300:39124,61301:39126,61302:39127,61303:39131,61304:39132,61305:39133,61306:39136,61307:39137,61308:39138,61309:39139,61310:39140,61312:39141,61313:39142,61314:39145,61315:39146,61316:39147,61317:39148,61318:39149,61319:39150,61320:39151,61321:39152,61322:39153,61323:39154,61324:39155,61325:39156,61326:39157,61327:39158,61328:39159,61329:39160,61330:39161,61331:39162,61332:39163,61333:39164,61334:39165,61335:39166,61336:39167,61337:39168,61338:39169,61339:39170,61340:39171,61341:39172,61342:39173,61343:39174,61344:39175,61345:38121,61346:38123,61347:38126,61348:38127,61349:38131,61350:38132,61351:38133,61352:38135,61353:38137,61354:38140,61355:38141,61356:38143,61357:38147,61358:38146,61359:38150,61360:38151,61361:38153,61362:38154,61363:38157,61364:38158,61365:38159,61366:38162,61367:38163,61368:38164,61369:38165,61370:38166,61371:38168,61372:38171,61373:38173,61374:38174,61375:38175,61376:38178,61377:38186,61378:38187,61379:38185,61380:38188,61381:38193,61382:38194,61383:38196,61384:38198,61385:38199,61386:38200,61387:38204,61388:38206,61389:38207,61390:38210,61391:38197,61392:38212,61393:38213,61394:38214,61395:38217,61396:38220,61397:38222,61398:38223,61399:38226,61400:38227,61401:38228,61402:38230,61403:38231,61404:38232,61405:38233,61406:38235,61407:38238,61408:38239,61409:38237,61410:38241,61411:38242,61412:38244,61413:38245,61414:38246,61415:38247,61416:38248,61417:38249,61418:38250,61419:38251,61420:38252,61421:38255,61422:38257,61423:38258,61424:38259,61425:38202,61426:30695,61427:30700,61428:38601,61429:31189,61430:31213,61431:31203,61432:31211,61433:31238,61434:23879,61435:31235,61436:31234,61437:31262,61438:31252,61504:39176,61505:39177,61506:39178,61507:39179,61508:39180,61509:39182,61510:39183,61511:39185,61512:39186,61513:39187,61514:39188,61515:39189,61516:39190,61517:39191,61518:39192,61519:39193,61520:39194,61521:39195,61522:39196,61523:39197,61524:39198,61525:39199,61526:39200,61527:39201,61528:39202,61529:39203,61530:39204,61531:39205,61532:39206,61533:39207,61534:39208,61535:39209,61536:39210,61537:39211,61538:39212,61539:39213,61540:39215,61541:39216,61542:39217,61543:39218,61544:39219,61545:39220,61546:39221,61547:39222,61548:39223,61549:39224,61550:39225,61551:39226,61552:39227,61553:39228,61554:39229,61555:39230,61556:39231,61557:39232,61558:39233,61559:39234,61560:39235,61561:39236,61562:39237,61563:39238,61564:39239,61565:39240,61566:39241,61568:39242,61569:39243,61570:39244,61571:39245,61572:39246,61573:39247,61574:39248,61575:39249,61576:39250,61577:39251,61578:39254,61579:39255,61580:39256,61581:39257,61582:39258,61583:39259,61584:39260,61585:39261,61586:39262,61587:39263,61588:39264,61589:39265,61590:39266,61591:39268,61592:39270,61593:39283,61594:39288,61595:39289,61596:39291,61597:39294,61598:39298,61599:39299,61600:39305,61601:31289,61602:31287,61603:31313,61604:40655,61605:39333,61606:31344,61607:30344,61608:30350,61609:30355,61610:30361,61611:30372,61612:29918,61613:29920,61614:29996,61615:40480,61616:40482,61617:40488,61618:40489,61619:40490,61620:40491,61621:40492,61622:40498,61623:40497,61624:40502,61625:40504,61626:40503,61627:40505,61628:40506,61629:40510,61630:40513,61631:40514,61632:40516,61633:40518,61634:40519,61635:40520,61636:40521,61637:40523,61638:40524,61639:40526,61640:40529,61641:40533,61642:40535,61643:40538,61644:40539,61645:40540,61646:40542,61647:40547,61648:40550,61649:40551,61650:40552,61651:40553,61652:40554,61653:40555,61654:40556,61655:40561,61656:40557,61657:40563,61658:30098,61659:30100,61660:30102,61661:30112,61662:30109,61663:30124,61664:30115,61665:30131,61666:30132,61667:30136,61668:30148,61669:30129,61670:30128,61671:30147,61672:30146,61673:30166,61674:30157,61675:30179,61676:30184,61677:30182,61678:30180,61679:30187,61680:30183,61681:30211,61682:30193,61683:30204,61684:30207,61685:30224,61686:30208,61687:30213,61688:30220,61689:30231,61690:30218,61691:30245,61692:30232,61693:30229,61694:30233,61760:39308,61761:39310,61762:39322,61763:39323,61764:39324,61765:39325,61766:39326,61767:39327,61768:39328,61769:39329,61770:39330,61771:39331,61772:39332,61773:39334,61774:39335,61775:39337,61776:39338,61777:39339,61778:39340,61779:39341,61780:39342,61781:39343,61782:39344,61783:39345,61784:39346,61785:39347,61786:39348,61787:39349,61788:39350,61789:39351,61790:39352,61791:39353,61792:39354,61793:39355,61794:39356,61795:39357,61796:39358,61797:39359,61798:39360,61799:39361,61800:39362,61801:39363,61802:39364,61803:39365,61804:39366,61805:39367,61806:39368,61807:39369,61808:39370,61809:39371,61810:39372,61811:39373,61812:39374,61813:39375,61814:39376,61815:39377,61816:39378,61817:39379,61818:39380,61819:39381,61820:39382,61821:39383,61822:39384,61824:39385,61825:39386,61826:39387,61827:39388,61828:39389,61829:39390,61830:39391,61831:39392,61832:39393,61833:39394,61834:39395,61835:39396,61836:39397,61837:39398,61838:39399,61839:39400,61840:39401,61841:39402,61842:39403,61843:39404,61844:39405,61845:39406,61846:39407,61847:39408,61848:39409,61849:39410,61850:39411,61851:39412,61852:39413,61853:39414,61854:39415,61855:39416,61856:39417,61857:30235,61858:30268,61859:30242,61860:30240,61861:30272,61862:30253,61863:30256,61864:30271,61865:30261,61866:30275,61867:30270,61868:30259,61869:30285,61870:30302,61871:30292,61872:30300,61873:30294,61874:30315,61875:30319,61876:32714,61877:31462,61878:31352,61879:31353,61880:31360,61881:31366,61882:31368,61883:31381,61884:31398,61885:31392,61886:31404,61887:31400,61888:31405,61889:31411,61890:34916,61891:34921,61892:34930,61893:34941,61894:34943,61895:34946,61896:34978,61897:35014,61898:34999,61899:35004,61900:35017,61901:35042,61902:35022,61903:35043,61904:35045,61905:35057,61906:35098,61907:35068,61908:35048,61909:35070,61910:35056,61911:35105,61912:35097,61913:35091,61914:35099,61915:35082,61916:35124,61917:35115,61918:35126,61919:35137,61920:35174,61921:35195,61922:30091,61923:32997,61924:30386,61925:30388,61926:30684,61927:32786,61928:32788,61929:32790,61930:32796,61931:32800,61932:32802,61933:32805,61934:32806,61935:32807,61936:32809,61937:32808,61938:32817,61939:32779,61940:32821,61941:32835,61942:32838,61943:32845,61944:32850,61945:32873,61946:32881,61947:35203,61948:39032,61949:39040,61950:39043,62016:39418,62017:39419,62018:39420,62019:39421,62020:39422,62021:39423,62022:39424,62023:39425,62024:39426,62025:39427,62026:39428,62027:39429,62028:39430,62029:39431,62030:39432,62031:39433,62032:39434,62033:39435,62034:39436,62035:39437,62036:39438,62037:39439,62038:39440,62039:39441,62040:39442,62041:39443,62042:39444,62043:39445,62044:39446,62045:39447,62046:39448,62047:39449,62048:39450,62049:39451,62050:39452,62051:39453,62052:39454,62053:39455,62054:39456,62055:39457,62056:39458,62057:39459,62058:39460,62059:39461,62060:39462,62061:39463,62062:39464,62063:39465,62064:39466,62065:39467,62066:39468,62067:39469,62068:39470,62069:39471,62070:39472,62071:39473,62072:39474,62073:39475,62074:39476,62075:39477,62076:39478,62077:39479,62078:39480,62080:39481,62081:39482,62082:39483,62083:39484,62084:39485,62085:39486,62086:39487,62087:39488,62088:39489,62089:39490,62090:39491,62091:39492,62092:39493,62093:39494,62094:39495,62095:39496,62096:39497,62097:39498,62098:39499,62099:39500,62100:39501,62101:39502,62102:39503,62103:39504,62104:39505,62105:39506,62106:39507,62107:39508,62108:39509,62109:39510,62110:39511,62111:39512,62112:39513,62113:39049,62114:39052,62115:39053,62116:39055,62117:39060,62118:39066,62119:39067,62120:39070,62121:39071,62122:39073,62123:39074,62124:39077,62125:39078,62126:34381,62127:34388,62128:34412,62129:34414,62130:34431,62131:34426,62132:34428,62133:34427,62134:34472,62135:34445,62136:34443,62137:34476,62138:34461,62139:34471,62140:34467,62141:34474,62142:34451,62143:34473,62144:34486,62145:34500,62146:34485,62147:34510,62148:34480,62149:34490,62150:34481,62151:34479,62152:34505,62153:34511,62154:34484,62155:34537,62156:34545,62157:34546,62158:34541,62159:34547,62160:34512,62161:34579,62162:34526,62163:34548,62164:34527,62165:34520,62166:34513,62167:34563,62168:34567,62169:34552,62170:34568,62171:34570,62172:34573,62173:34569,62174:34595,62175:34619,62176:34590,62177:34597,62178:34606,62179:34586,62180:34622,62181:34632,62182:34612,62183:34609,62184:34601,62185:34615,62186:34623,62187:34690,62188:34594,62189:34685,62190:34686,62191:34683,62192:34656,62193:34672,62194:34636,62195:34670,62196:34699,62197:34643,62198:34659,62199:34684,62200:34660,62201:34649,62202:34661,62203:34707,62204:34735,62205:34728,62206:34770,62272:39514,62273:39515,62274:39516,62275:39517,62276:39518,62277:39519,62278:39520,62279:39521,62280:39522,62281:39523,62282:39524,62283:39525,62284:39526,62285:39527,62286:39528,62287:39529,62288:39530,62289:39531,62290:39538,62291:39555,62292:39561,62293:39565,62294:39566,62295:39572,62296:39573,62297:39577,62298:39590,62299:39593,62300:39594,62301:39595,62302:39596,62303:39597,62304:39598,62305:39599,62306:39602,62307:39603,62308:39604,62309:39605,62310:39609,62311:39611,62312:39613,62313:39614,62314:39615,62315:39619,62316:39620,62317:39622,62318:39623,62319:39624,62320:39625,62321:39626,62322:39629,62323:39630,62324:39631,62325:39632,62326:39634,62327:39636,62328:39637,62329:39638,62330:39639,62331:39641,62332:39642,62333:39643,62334:39644,62336:39645,62337:39646,62338:39648,62339:39650,62340:39651,62341:39652,62342:39653,62343:39655,62344:39656,62345:39657,62346:39658,62347:39660,62348:39662,62349:39664,62350:39665,62351:39666,62352:39667,62353:39668,62354:39669,62355:39670,62356:39671,62357:39672,62358:39674,62359:39676,62360:39677,62361:39678,62362:39679,62363:39680,62364:39681,62365:39682,62366:39684,62367:39685,62368:39686,62369:34758,62370:34696,62371:34693,62372:34733,62373:34711,62374:34691,62375:34731,62376:34789,62377:34732,62378:34741,62379:34739,62380:34763,62381:34771,62382:34749,62383:34769,62384:34752,62385:34762,62386:34779,62387:34794,62388:34784,62389:34798,62390:34838,62391:34835,62392:34814,62393:34826,62394:34843,62395:34849,62396:34873,62397:34876,62398:32566,62399:32578,62400:32580,62401:32581,62402:33296,62403:31482,62404:31485,62405:31496,62406:31491,62407:31492,62408:31509,62409:31498,62410:31531,62411:31503,62412:31559,62413:31544,62414:31530,62415:31513,62416:31534,62417:31537,62418:31520,62419:31525,62420:31524,62421:31539,62422:31550,62423:31518,62424:31576,62425:31578,62426:31557,62427:31605,62428:31564,62429:31581,62430:31584,62431:31598,62432:31611,62433:31586,62434:31602,62435:31601,62436:31632,62437:31654,62438:31655,62439:31672,62440:31660,62441:31645,62442:31656,62443:31621,62444:31658,62445:31644,62446:31650,62447:31659,62448:31668,62449:31697,62450:31681,62451:31692,62452:31709,62453:31706,62454:31717,62455:31718,62456:31722,62457:31756,62458:31742,62459:31740,62460:31759,62461:31766,62462:31755,62528:39687,62529:39689,62530:39690,62531:39691,62532:39692,62533:39693,62534:39694,62535:39696,62536:39697,62537:39698,62538:39700,62539:39701,62540:39702,62541:39703,62542:39704,62543:39705,62544:39706,62545:39707,62546:39708,62547:39709,62548:39710,62549:39712,62550:39713,62551:39714,62552:39716,62553:39717,62554:39718,62555:39719,62556:39720,62557:39721,62558:39722,62559:39723,62560:39724,62561:39725,62562:39726,62563:39728,62564:39729,62565:39731,62566:39732,62567:39733,62568:39734,62569:39735,62570:39736,62571:39737,62572:39738,62573:39741,62574:39742,62575:39743,62576:39744,62577:39750,62578:39754,62579:39755,62580:39756,62581:39758,62582:39760,62583:39762,62584:39763,62585:39765,62586:39766,62587:39767,62588:39768,62589:39769,62590:39770,62592:39771,62593:39772,62594:39773,62595:39774,62596:39775,62597:39776,62598:39777,62599:39778,62600:39779,62601:39780,62602:39781,62603:39782,62604:39783,62605:39784,62606:39785,62607:39786,62608:39787,62609:39788,62610:39789,62611:39790,62612:39791,62613:39792,62614:39793,62615:39794,62616:39795,62617:39796,62618:39797,62619:39798,62620:39799,62621:39800,62622:39801,62623:39802,62624:39803,62625:31775,62626:31786,62627:31782,62628:31800,62629:31809,62630:31808,62631:33278,62632:33281,62633:33282,62634:33284,62635:33260,62636:34884,62637:33313,62638:33314,62639:33315,62640:33325,62641:33327,62642:33320,62643:33323,62644:33336,62645:33339,62646:33331,62647:33332,62648:33342,62649:33348,62650:33353,62651:33355,62652:33359,62653:33370,62654:33375,62655:33384,62656:34942,62657:34949,62658:34952,62659:35032,62660:35039,62661:35166,62662:32669,62663:32671,62664:32679,62665:32687,62666:32688,62667:32690,62668:31868,62669:25929,62670:31889,62671:31901,62672:31900,62673:31902,62674:31906,62675:31922,62676:31932,62677:31933,62678:31937,62679:31943,62680:31948,62681:31949,62682:31944,62683:31941,62684:31959,62685:31976,62686:33390,62687:26280,62688:32703,62689:32718,62690:32725,62691:32741,62692:32737,62693:32742,62694:32745,62695:32750,62696:32755,62697:31992,62698:32119,62699:32166,62700:32174,62701:32327,62702:32411,62703:40632,62704:40628,62705:36211,62706:36228,62707:36244,62708:36241,62709:36273,62710:36199,62711:36205,62712:35911,62713:35913,62714:37194,62715:37200,62716:37198,62717:37199,62718:37220,62784:39804,62785:39805,62786:39806,62787:39807,62788:39808,62789:39809,62790:39810,62791:39811,62792:39812,62793:39813,62794:39814,62795:39815,62796:39816,62797:39817,62798:39818,62799:39819,62800:39820,62801:39821,62802:39822,62803:39823,62804:39824,62805:39825,62806:39826,62807:39827,62808:39828,62809:39829,62810:39830,62811:39831,62812:39832,62813:39833,62814:39834,62815:39835,62816:39836,62817:39837,62818:39838,62819:39839,62820:39840,62821:39841,62822:39842,62823:39843,62824:39844,62825:39845,62826:39846,62827:39847,62828:39848,62829:39849,62830:39850,62831:39851,62832:39852,62833:39853,62834:39854,62835:39855,62836:39856,62837:39857,62838:39858,62839:39859,62840:39860,62841:39861,62842:39862,62843:39863,62844:39864,62845:39865,62846:39866,62848:39867,62849:39868,62850:39869,62851:39870,62852:39871,62853:39872,62854:39873,62855:39874,62856:39875,62857:39876,62858:39877,62859:39878,62860:39879,62861:39880,62862:39881,62863:39882,62864:39883,62865:39884,62866:39885,62867:39886,62868:39887,62869:39888,62870:39889,62871:39890,62872:39891,62873:39892,62874:39893,62875:39894,62876:39895,62877:39896,62878:39897,62879:39898,62880:39899,62881:37218,62882:37217,62883:37232,62884:37225,62885:37231,62886:37245,62887:37246,62888:37234,62889:37236,62890:37241,62891:37260,62892:37253,62893:37264,62894:37261,62895:37265,62896:37282,62897:37283,62898:37290,62899:37293,62900:37294,62901:37295,62902:37301,62903:37300,62904:37306,62905:35925,62906:40574,62907:36280,62908:36331,62909:36357,62910:36441,62911:36457,62912:36277,62913:36287,62914:36284,62915:36282,62916:36292,62917:36310,62918:36311,62919:36314,62920:36318,62921:36302,62922:36303,62923:36315,62924:36294,62925:36332,62926:36343,62927:36344,62928:36323,62929:36345,62930:36347,62931:36324,62932:36361,62933:36349,62934:36372,62935:36381,62936:36383,62937:36396,62938:36398,62939:36387,62940:36399,62941:36410,62942:36416,62943:36409,62944:36405,62945:36413,62946:36401,62947:36425,62948:36417,62949:36418,62950:36433,62951:36434,62952:36426,62953:36464,62954:36470,62955:36476,62956:36463,62957:36468,62958:36485,62959:36495,62960:36500,62961:36496,62962:36508,62963:36510,62964:35960,62965:35970,62966:35978,62967:35973,62968:35992,62969:35988,62970:26011,62971:35286,62972:35294,62973:35290,62974:35292,63040:39900,63041:39901,63042:39902,63043:39903,63044:39904,63045:39905,63046:39906,63047:39907,63048:39908,63049:39909,63050:39910,63051:39911,63052:39912,63053:39913,63054:39914,63055:39915,63056:39916,63057:39917,63058:39918,63059:39919,63060:39920,63061:39921,63062:39922,63063:39923,63064:39924,63065:39925,63066:39926,63067:39927,63068:39928,63069:39929,63070:39930,63071:39931,63072:39932,63073:39933,63074:39934,63075:39935,63076:39936,63077:39937,63078:39938,63079:39939,63080:39940,63081:39941,63082:39942,63083:39943,63084:39944,63085:39945,63086:39946,63087:39947,63088:39948,63089:39949,63090:39950,63091:39951,63092:39952,63093:39953,63094:39954,63095:39955,63096:39956,63097:39957,63098:39958,63099:39959,63100:39960,63101:39961,63102:39962,63104:39963,63105:39964,63106:39965,63107:39966,63108:39967,63109:39968,63110:39969,63111:39970,63112:39971,63113:39972,63114:39973,63115:39974,63116:39975,63117:39976,63118:39977,63119:39978,63120:39979,63121:39980,63122:39981,63123:39982,63124:39983,63125:39984,63126:39985,63127:39986,63128:39987,63129:39988,63130:39989,63131:39990,63132:39991,63133:39992,63134:39993,63135:39994,63136:39995,63137:35301,63138:35307,63139:35311,63140:35390,63141:35622,63142:38739,63143:38633,63144:38643,63145:38639,63146:38662,63147:38657,63148:38664,63149:38671,63150:38670,63151:38698,63152:38701,63153:38704,63154:38718,63155:40832,63156:40835,63157:40837,63158:40838,63159:40839,63160:40840,63161:40841,63162:40842,63163:40844,63164:40702,63165:40715,63166:40717,63167:38585,63168:38588,63169:38589,63170:38606,63171:38610,63172:30655,63173:38624,63174:37518,63175:37550,63176:37576,63177:37694,63178:37738,63179:37834,63180:37775,63181:37950,63182:37995,63183:40063,63184:40066,63185:40069,63186:40070,63187:40071,63188:40072,63189:31267,63190:40075,63191:40078,63192:40080,63193:40081,63194:40082,63195:40084,63196:40085,63197:40090,63198:40091,63199:40094,63200:40095,63201:40096,63202:40097,63203:40098,63204:40099,63205:40101,63206:40102,63207:40103,63208:40104,63209:40105,63210:40107,63211:40109,63212:40110,63213:40112,63214:40113,63215:40114,63216:40115,63217:40116,63218:40117,63219:40118,63220:40119,63221:40122,63222:40123,63223:40124,63224:40125,63225:40132,63226:40133,63227:40134,63228:40135,63229:40138,63230:40139,63296:39996,63297:39997,63298:39998,63299:39999,63300:40000,63301:40001,63302:40002,63303:40003,63304:40004,63305:40005,63306:40006,63307:40007,63308:40008,63309:40009,63310:40010,63311:40011,63312:40012,63313:40013,63314:40014,63315:40015,63316:40016,63317:40017,63318:40018,63319:40019,63320:40020,63321:40021,63322:40022,63323:40023,63324:40024,63325:40025,63326:40026,63327:40027,63328:40028,63329:40029,63330:40030,63331:40031,63332:40032,63333:40033,63334:40034,63335:40035,63336:40036,63337:40037,63338:40038,63339:40039,63340:40040,63341:40041,63342:40042,63343:40043,63344:40044,63345:40045,63346:40046,63347:40047,63348:40048,63349:40049,63350:40050,63351:40051,63352:40052,63353:40053,63354:40054,63355:40055,63356:40056,63357:40057,63358:40058,63360:40059,63361:40061,63362:40062,63363:40064,63364:40067,63365:40068,63366:40073,63367:40074,63368:40076,63369:40079,63370:40083,63371:40086,63372:40087,63373:40088,63374:40089,63375:40093,63376:40106,63377:40108,63378:40111,63379:40121,63380:40126,63381:40127,63382:40128,63383:40129,63384:40130,63385:40136,63386:40137,63387:40145,63388:40146,63389:40154,63390:40155,63391:40160,63392:40161,63393:40140,63394:40141,63395:40142,63396:40143,63397:40144,63398:40147,63399:40148,63400:40149,63401:40151,63402:40152,63403:40153,63404:40156,63405:40157,63406:40159,63407:40162,63408:38780,63409:38789,63410:38801,63411:38802,63412:38804,63413:38831,63414:38827,63415:38819,63416:38834,63417:38836,63418:39601,63419:39600,63420:39607,63421:40536,63422:39606,63423:39610,63424:39612,63425:39617,63426:39616,63427:39621,63428:39618,63429:39627,63430:39628,63431:39633,63432:39749,63433:39747,63434:39751,63435:39753,63436:39752,63437:39757,63438:39761,63439:39144,63440:39181,63441:39214,63442:39253,63443:39252,63444:39647,63445:39649,63446:39654,63447:39663,63448:39659,63449:39675,63450:39661,63451:39673,63452:39688,63453:39695,63454:39699,63455:39711,63456:39715,63457:40637,63458:40638,63459:32315,63460:40578,63461:40583,63462:40584,63463:40587,63464:40594,63465:37846,63466:40605,63467:40607,63468:40667,63469:40668,63470:40669,63471:40672,63472:40671,63473:40674,63474:40681,63475:40679,63476:40677,63477:40682,63478:40687,63479:40738,63480:40748,63481:40751,63482:40761,63483:40759,63484:40765,63485:40766,63486:40772,63552:40163,63553:40164,63554:40165,63555:40166,63556:40167,63557:40168,63558:40169,63559:40170,63560:40171,63561:40172,63562:40173,63563:40174,63564:40175,63565:40176,63566:40177,63567:40178,63568:40179,63569:40180,63570:40181,63571:40182,63572:40183,63573:40184,63574:40185,63575:40186,63576:40187,63577:40188,63578:40189,63579:40190,63580:40191,63581:40192,63582:40193,63583:40194,63584:40195,63585:40196,63586:40197,63587:40198,63588:40199,63589:40200,63590:40201,63591:40202,63592:40203,63593:40204,63594:40205,63595:40206,63596:40207,63597:40208,63598:40209,63599:40210,63600:40211,63601:40212,63602:40213,63603:40214,63604:40215,63605:40216,63606:40217,63607:40218,63608:40219,63609:40220,63610:40221,63611:40222,63612:40223,63613:40224,63614:40225,63616:40226,63617:40227,63618:40228,63619:40229,63620:40230,63621:40231,63622:40232,63623:40233,63624:40234,63625:40235,63626:40236,63627:40237,63628:40238,63629:40239,63630:40240,63631:40241,63632:40242,63633:40243,63634:40244,63635:40245,63636:40246,63637:40247,63638:40248,63639:40249,63640:40250,63641:40251,63642:40252,63643:40253,63644:40254,63645:40255,63646:40256,63647:40257,63648:40258,63649:57908,63650:57909,63651:57910,63652:57911,63653:57912,63654:57913,63655:57914,63656:57915,63657:57916,63658:57917,63659:57918,63660:57919,63661:57920,63662:57921,63663:57922,63664:57923,63665:57924,63666:57925,63667:57926,63668:57927,63669:57928,63670:57929,63671:57930,63672:57931,63673:57932,63674:57933,63675:57934,63676:57935,63677:57936,63678:57937,63679:57938,63680:57939,63681:57940,63682:57941,63683:57942,63684:57943,63685:57944,63686:57945,63687:57946,63688:57947,63689:57948,63690:57949,63691:57950,63692:57951,63693:57952,63694:57953,63695:57954,63696:57955,63697:57956,63698:57957,63699:57958,63700:57959,63701:57960,63702:57961,63703:57962,63704:57963,63705:57964,63706:57965,63707:57966,63708:57967,63709:57968,63710:57969,63711:57970,63712:57971,63713:57972,63714:57973,63715:57974,63716:57975,63717:57976,63718:57977,63719:57978,63720:57979,63721:57980,63722:57981,63723:57982,63724:57983,63725:57984,63726:57985,63727:57986,63728:57987,63729:57988,63730:57989,63731:57990,63732:57991,63733:57992,63734:57993,63735:57994,63736:57995,63737:57996,63738:57997,63739:57998,63740:57999,63741:58000,63742:58001,63808:40259,63809:40260,63810:40261,63811:40262,63812:40263,63813:40264,63814:40265,63815:40266,63816:40267,63817:40268,63818:40269,63819:40270,63820:40271,63821:40272,63822:40273,63823:40274,63824:40275,63825:40276,63826:40277,63827:40278,63828:40279,63829:40280,63830:40281,63831:40282,63832:40283,63833:40284,63834:40285,63835:40286,63836:40287,63837:40288,63838:40289,63839:40290,63840:40291,63841:40292,63842:40293,63843:40294,63844:40295,63845:40296,63846:40297,63847:40298,63848:40299,63849:40300,63850:40301,63851:40302,63852:40303,63853:40304,63854:40305,63855:40306,63856:40307,63857:40308,63858:40309,63859:40310,63860:40311,63861:40312,63862:40313,63863:40314,63864:40315,63865:40316,63866:40317,63867:40318,63868:40319,63869:40320,63870:40321,63872:40322,63873:40323,63874:40324,63875:40325,63876:40326,63877:40327,63878:40328,63879:40329,63880:40330,63881:40331,63882:40332,63883:40333,63884:40334,63885:40335,63886:40336,63887:40337,63888:40338,63889:40339,63890:40340,63891:40341,63892:40342,63893:40343,63894:40344,63895:40345,63896:40346,63897:40347,63898:40348,63899:40349,63900:40350,63901:40351,63902:40352,63903:40353,63904:40354,63905:58002,63906:58003,63907:58004,63908:58005,63909:58006,63910:58007,63911:58008,63912:58009,63913:58010,63914:58011,63915:58012,63916:58013,63917:58014,63918:58015,63919:58016,63920:58017,63921:58018,63922:58019,63923:58020,63924:58021,63925:58022,63926:58023,63927:58024,63928:58025,63929:58026,63930:58027,63931:58028,63932:58029,63933:58030,63934:58031,63935:58032,63936:58033,63937:58034,63938:58035,63939:58036,63940:58037,63941:58038,63942:58039,63943:58040,63944:58041,63945:58042,63946:58043,63947:58044,63948:58045,63949:58046,63950:58047,63951:58048,63952:58049,63953:58050,63954:58051,63955:58052,63956:58053,63957:58054,63958:58055,63959:58056,63960:58057,63961:58058,63962:58059,63963:58060,63964:58061,63965:58062,63966:58063,63967:58064,63968:58065,63969:58066,63970:58067,63971:58068,63972:58069,63973:58070,63974:58071,63975:58072,63976:58073,63977:58074,63978:58075,63979:58076,63980:58077,63981:58078,63982:58079,63983:58080,63984:58081,63985:58082,63986:58083,63987:58084,63988:58085,63989:58086,63990:58087,63991:58088,63992:58089,63993:58090,63994:58091,63995:58092,63996:58093,63997:58094,63998:58095,64064:40355,64065:40356,64066:40357,64067:40358,64068:40359,64069:40360,64070:40361,64071:40362,64072:40363,64073:40364,64074:40365,64075:40366,64076:40367,64077:40368,64078:40369,64079:40370,64080:40371,64081:40372,64082:40373,64083:40374,64084:40375,64085:40376,64086:40377,64087:40378,64088:40379,64089:40380,64090:40381,64091:40382,64092:40383,64093:40384,64094:40385,64095:40386,64096:40387,64097:40388,64098:40389,64099:40390,64100:40391,64101:40392,64102:40393,64103:40394,64104:40395,64105:40396,64106:40397,64107:40398,64108:40399,64109:40400,64110:40401,64111:40402,64112:40403,64113:40404,64114:40405,64115:40406,64116:40407,64117:40408,64118:40409,64119:40410,64120:40411,64121:40412,64122:40413,64123:40414,64124:40415,64125:40416,64126:40417,64128:40418,64129:40419,64130:40420,64131:40421,64132:40422,64133:40423,64134:40424,64135:40425,64136:40426,64137:40427,64138:40428,64139:40429,64140:40430,64141:40431,64142:40432,64143:40433,64144:40434,64145:40435,64146:40436,64147:40437,64148:40438,64149:40439,64150:40440,64151:40441,64152:40442,64153:40443,64154:40444,64155:40445,64156:40446,64157:40447,64158:40448,64159:40449,64160:40450,64161:58096,64162:58097,64163:58098,64164:58099,64165:58100,64166:58101,64167:58102,64168:58103,64169:58104,64170:58105,64171:58106,64172:58107,64173:58108,64174:58109,64175:58110,64176:58111,64177:58112,64178:58113,64179:58114,64180:58115,64181:58116,64182:58117,64183:58118,64184:58119,64185:58120,64186:58121,64187:58122,64188:58123,64189:58124,64190:58125,64191:58126,64192:58127,64193:58128,64194:58129,64195:58130,64196:58131,64197:58132,64198:58133,64199:58134,64200:58135,64201:58136,64202:58137,64203:58138,64204:58139,64205:58140,64206:58141,64207:58142,64208:58143,64209:58144,64210:58145,64211:58146,64212:58147,64213:58148,64214:58149,64215:58150,64216:58151,64217:58152,64218:58153,64219:58154,64220:58155,64221:58156,64222:58157,64223:58158,64224:58159,64225:58160,64226:58161,64227:58162,64228:58163,64229:58164,64230:58165,64231:58166,64232:58167,64233:58168,64234:58169,64235:58170,64236:58171,64237:58172,64238:58173,64239:58174,64240:58175,64241:58176,64242:58177,64243:58178,64244:58179,64245:58180,64246:58181,64247:58182,64248:58183,64249:58184,64250:58185,64251:58186,64252:58187,64253:58188,64254:58189,64320:40451,64321:40452,64322:40453,64323:40454,64324:40455,64325:40456,64326:40457,64327:40458,64328:40459,64329:40460,64330:40461,64331:40462,64332:40463,64333:40464,64334:40465,64335:40466,64336:40467,64337:40468,64338:40469,64339:40470,64340:40471,64341:40472,64342:40473,64343:40474,64344:40475,64345:40476,64346:40477,64347:40478,64348:40484,64349:40487,64350:40494,64351:40496,64352:40500,64353:40507,64354:40508,64355:40512,64356:40525,64357:40528,64358:40530,64359:40531,64360:40532,64361:40534,64362:40537,64363:40541,64364:40543,64365:40544,64366:40545,64367:40546,64368:40549,64369:40558,64370:40559,64371:40562,64372:40564,64373:40565,64374:40566,64375:40567,64376:40568,64377:40569,64378:40570,64379:40571,64380:40572,64381:40573,64382:40576,64384:40577,64385:40579,64386:40580,64387:40581,64388:40582,64389:40585,64390:40586,64391:40588,64392:40589,64393:40590,64394:40591,64395:40592,64396:40593,64397:40596,64398:40597,64399:40598,64400:40599,64401:40600,64402:40601,64403:40602,64404:40603,64405:40604,64406:40606,64407:40608,64408:40609,64409:40610,64410:40611,64411:40612,64412:40613,64413:40615,64414:40616,64415:40617,64416:40618,64417:58190,64418:58191,64419:58192,64420:58193,64421:58194,64422:58195,64423:58196,64424:58197,64425:58198,64426:58199,64427:58200,64428:58201,64429:58202,64430:58203,64431:58204,64432:58205,64433:58206,64434:58207,64435:58208,64436:58209,64437:58210,64438:58211,64439:58212,64440:58213,64441:58214,64442:58215,64443:58216,64444:58217,64445:58218,64446:58219,64447:58220,64448:58221,64449:58222,64450:58223,64451:58224,64452:58225,64453:58226,64454:58227,64455:58228,64456:58229,64457:58230,64458:58231,64459:58232,64460:58233,64461:58234,64462:58235,64463:58236,64464:58237,64465:58238,64466:58239,64467:58240,64468:58241,64469:58242,64470:58243,64471:58244,64472:58245,64473:58246,64474:58247,64475:58248,64476:58249,64477:58250,64478:58251,64479:58252,64480:58253,64481:58254,64482:58255,64483:58256,64484:58257,64485:58258,64486:58259,64487:58260,64488:58261,64489:58262,64490:58263,64491:58264,64492:58265,64493:58266,64494:58267,64495:58268,64496:58269,64497:58270,64498:58271,64499:58272,64500:58273,64501:58274,64502:58275,64503:58276,64504:58277,64505:58278,64506:58279,64507:58280,64508:58281,64509:58282,64510:58283,64576:40619,64577:40620,64578:40621,64579:40622,64580:40623,64581:40624,64582:40625,64583:40626,64584:40627,64585:40629,64586:40630,64587:40631,64588:40633,64589:40634,64590:40636,64591:40639,64592:40640,64593:40641,64594:40642,64595:40643,64596:40645,64597:40646,64598:40647,64599:40648,64600:40650,64601:40651,64602:40652,64603:40656,64604:40658,64605:40659,64606:40661,64607:40662,64608:40663,64609:40665,64610:40666,64611:40670,64612:40673,64613:40675,64614:40676,64615:40678,64616:40680,64617:40683,64618:40684,64619:40685,64620:40686,64621:40688,64622:40689,64623:40690,64624:40691,64625:40692,64626:40693,64627:40694,64628:40695,64629:40696,64630:40698,64631:40701,64632:40703,64633:40704,64634:40705,64635:40706,64636:40707,64637:40708,64638:40709,64640:40710,64641:40711,64642:40712,64643:40713,64644:40714,64645:40716,64646:40719,64647:40721,64648:40722,64649:40724,64650:40725,64651:40726,64652:40728,64653:40730,64654:40731,64655:40732,64656:40733,64657:40734,64658:40735,64659:40737,64660:40739,64661:40740,64662:40741,64663:40742,64664:40743,64665:40744,64666:40745,64667:40746,64668:40747,64669:40749,64670:40750,64671:40752,64672:40753,64673:58284,64674:58285,64675:58286,64676:58287,64677:58288,64678:58289,64679:58290,64680:58291,64681:58292,64682:58293,64683:58294,64684:58295,64685:58296,64686:58297,64687:58298,64688:58299,64689:58300,64690:58301,64691:58302,64692:58303,64693:58304,64694:58305,64695:58306,64696:58307,64697:58308,64698:58309,64699:58310,64700:58311,64701:58312,64702:58313,64703:58314,64704:58315,64705:58316,64706:58317,64707:58318,64708:58319,64709:58320,64710:58321,64711:58322,64712:58323,64713:58324,64714:58325,64715:58326,64716:58327,64717:58328,64718:58329,64719:58330,64720:58331,64721:58332,64722:58333,64723:58334,64724:58335,64725:58336,64726:58337,64727:58338,64728:58339,64729:58340,64730:58341,64731:58342,64732:58343,64733:58344,64734:58345,64735:58346,64736:58347,64737:58348,64738:58349,64739:58350,64740:58351,64741:58352,64742:58353,64743:58354,64744:58355,64745:58356,64746:58357,64747:58358,64748:58359,64749:58360,64750:58361,64751:58362,64752:58363,64753:58364,64754:58365,64755:58366,64756:58367,64757:58368,64758:58369,64759:58370,64760:58371,64761:58372,64762:58373,64763:58374,64764:58375,64765:58376,64766:58377,64832:40754,64833:40755,64834:40756,64835:40757,64836:40758,64837:40760,64838:40762,64839:40764,64840:40767,64841:40768,64842:40769,64843:40770,64844:40771,64845:40773,64846:40774,64847:40775,64848:40776,64849:40777,64850:40778,64851:40779,64852:40780,64853:40781,64854:40782,64855:40783,64856:40786,64857:40787,64858:40788,64859:40789,64860:40790,64861:40791,64862:40792,64863:40793,64864:40794,64865:40795,64866:40796,64867:40797,64868:40798,64869:40799,64870:40800,64871:40801,64872:40802,64873:40803,64874:40804,64875:40805,64876:40806,64877:40807,64878:40808,64879:40809,64880:40810,64881:40811,64882:40812,64883:40813,64884:40814,64885:40815,64886:40816,64887:40817,64888:40818,64889:40819,64890:40820,64891:40821,64892:40822,64893:40823,64894:40824,64896:40825,64897:40826,64898:40827,64899:40828,64900:40829,64901:40830,64902:40833,64903:40834,64904:40845,64905:40846,64906:40847,64907:40848,64908:40849,64909:40850,64910:40851,64911:40852,64912:40853,64913:40854,64914:40855,64915:40856,64916:40860,64917:40861,64918:40862,64919:40865,64920:40866,64921:40867,64922:40868,64923:40869,64924:63788,64925:63865,64926:63893,64927:63975,64928:63985,64929:58378,64930:58379,64931:58380,64932:58381,64933:58382,64934:58383,64935:58384,64936:58385,64937:58386,64938:58387,64939:58388,64940:58389,64941:58390,64942:58391,64943:58392,64944:58393,64945:58394,64946:58395,64947:58396,64948:58397,64949:58398,64950:58399,64951:58400,64952:58401,64953:58402,64954:58403,64955:58404,64956:58405,64957:58406,64958:58407,64959:58408,64960:58409,64961:58410,64962:58411,64963:58412,64964:58413,64965:58414,64966:58415,64967:58416,64968:58417,64969:58418,64970:58419,64971:58420,64972:58421,64973:58422,64974:58423,64975:58424,64976:58425,64977:58426,64978:58427,64979:58428,64980:58429,64981:58430,64982:58431,64983:58432,64984:58433,64985:58434,64986:58435,64987:58436,64988:58437,64989:58438,64990:58439,64991:58440,64992:58441,64993:58442,64994:58443,64995:58444,64996:58445,64997:58446,64998:58447,64999:58448,65000:58449,65001:58450,65002:58451,65003:58452,65004:58453,65005:58454,65006:58455,65007:58456,65008:58457,65009:58458,65010:58459,65011:58460,65012:58461,65013:58462,65014:58463,65015:58464,65016:58465,65017:58466,65018:58467,65019:58468,65020:58469,65021:58470,65022:58471,65088:64012,65089:64013,65090:64014,65091:64015,65092:64017,65093:64019,65094:64020,65095:64024,65096:64031,65097:64032,65098:64033,65099:64035,65100:64036,65101:64039,65102:64040,65103:64041,65104:11905,65105:59414,65106:59415,65107:59416,65108:11908,65109:13427,65110:13383,65111:11912,65112:11915,65113:59422,65114:13726,65115:13850,65116:13838,65117:11916,65118:11927,65119:14702,65120:14616,65121:59430,65122:14799,65123:14815,65124:14963,65125:14800,65126:59435,65127:59436,65128:15182,65129:15470,65130:15584,65131:11943,65132:59441,65133:59442,65134:11946,65135:16470,65136:16735,65137:11950,65138:17207,65139:11955,65140:11958,65141:11959,65142:59451,65143:17329,65144:17324,65145:11963,65146:17373,65147:17622,65148:18017,65149:17996,65150:59459,65152:18211,65153:18217,65154:18300,65155:18317,65156:11978,65157:18759,65158:18810,65159:18813,65160:18818,65161:18819,65162:18821,65163:18822,65164:18847,65165:18843,65166:18871,65167:18870,65168:59476,65169:59477,65170:19619,65171:19615,65172:19616,65173:19617,65174:19575,65175:19618,65176:19731,65177:19732,65178:19733,65179:19734,65180:19735,65181:19736,65182:19737,65183:19886,65184:59492,65185:58472,65186:58473,65187:58474,65188:58475,65189:58476,65190:58477,65191:58478,65192:58479,65193:58480,65194:58481,65195:58482,65196:58483,65197:58484,65198:58485,65199:58486,65200:58487,65201:58488,65202:58489,65203:58490,65204:58491,65205:58492,65206:58493,65207:58494,65208:58495,65209:58496,65210:58497,65211:58498,65212:58499,65213:58500,65214:58501,65215:58502,65216:58503,65217:58504,65218:58505,65219:58506,65220:58507,65221:58508,65222:58509,65223:58510,65224:58511,65225:58512,65226:58513,65227:58514,65228:58515,65229:58516,65230:58517,65231:58518,65232:58519,65233:58520,65234:58521,65235:58522,65236:58523,65237:58524,65238:58525,65239:58526,65240:58527,65241:58528,65242:58529,65243:58530,65244:58531,65245:58532,65246:58533,65247:58534,65248:58535,65249:58536,65250:58537,65251:58538,65252:58539,65253:58540,65254:58541,65255:58542,65256:58543,65257:58544,65258:58545,65259:58546,65260:58547,65261:58548,65262:58549,65263:58550,65264:58551,65265:58552,65266:58553,65267:58554,65268:58555,65269:58556,65270:58557,65271:58558,65272:58559,65273:58560,65274:58561,65275:58562,65276:58563,65277:58564,65278:58565} -},{}],110:[function(require,module,exports){ -var RE_SPACEDASH = /[- ]/g; -// Module exports -var iconv = module.exports = { - toEncoding: function(str, encoding) { - return iconv.getCodec(encoding).toEncoding(str); - }, - fromEncoding: function(buf, encoding) { - return iconv.getCodec(encoding).fromEncoding(buf); - }, - encodingExists: function(enc) { - loadEncodings(); - enc = enc.replace(RE_SPACEDASH, "").toLowerCase(); - return (iconv.encodings[enc] !== undefined); - }, - - defaultCharUnicode: '�', - defaultCharSingleByte: '?', - - encodingsLoaded: false, - - // Get correct codec for given encoding. - getCodec: function(encoding) { - loadEncodings(); - var enc = encoding || "utf8"; - var codecOptions = undefined; - while (1) { - if (getType(enc) === "String") - enc = enc.replace(RE_SPACEDASH, "").toLowerCase(); - var codec = iconv.encodings[enc]; - var type = getType(codec); - if (type === "String") { - // Link to other encoding. - codecOptions = {originalEncoding: enc}; - enc = codec; - } - else if (type === "Object" && codec.type != undefined) { - // Options for other encoding. - codecOptions = codec; - enc = codec.type; - } - else if (type === "Function") - // Codec itself. - return codec(codecOptions); - else - throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')"); - } - }, - - // Define basic encodings - encodings: { - internal: function(options) { - return { - toEncoding: toInternalEncoding, - fromEncoding: fromInternalEncoding, - options: options - }; - }, - utf8: "internal", - ucs2: "internal", - binary: "internal", - ascii: "internal", - base64: "internal", - - // Codepage single-byte encodings. - singlebyte: function(options) { - // Prepare chars if needed - if (!options.charsBuf) { - if (!options.chars || (options.chars.length !== 128 && options.chars.length !== 256)) - throw new Error("Encoding '"+options.type+"' has incorrect 'chars' (must be of len 128 or 256)"); - - if (options.chars.length === 128) - options.chars = asciiString + options.chars; - - options.charsBuf = new Buffer(options.chars, 'ucs2'); - } - - if (!options.revCharsBuf) { - options.revCharsBuf = new Buffer(65536); - var defChar = iconv.defaultCharSingleByte.charCodeAt(0); - for (var i = 0; i < options.revCharsBuf.length; i++) - options.revCharsBuf[i] = defChar; - for (var i = 0; i < options.chars.length; i++) - options.revCharsBuf[options.chars.charCodeAt(i)] = i; - } - - return { - toEncoding: toSingleByteEncoding, - fromEncoding: fromSingleByteEncoding, - options: options, - }; - }, - - // Codepage double-byte encodings. - table: function(options) { - if (!options.table) { - throw new Error("Encoding '" + options.type + "' has incorect 'table' option"); - } - if (!options.revCharsTable) { - var revCharsTable = options.revCharsTable = {}; - for (var i = 0; i <= 0xFFFF; i++) { - revCharsTable[i] = 0; - } - - var table = options.table; - for (var key in table) { - revCharsTable[table[key]] = +key; - } - } - - return { - toEncoding: toTableEncoding, - fromEncoding: fromTableEncoding, - options: options, - }; - } - } -}; - -function toInternalEncoding(str) { - return new Buffer(ensureString(str), this.options.originalEncoding); -} - -function fromInternalEncoding(buf) { - return ensureBuffer(buf).toString(this.options.originalEncoding); -} - -function toTableEncoding(str) { - str = ensureString(str); - var strLen = str.length; - var revCharsTable = this.options.revCharsTable; - var newBuf = new Buffer(strLen*2), gbkcode, unicode, - defaultChar = revCharsTable[iconv.defaultCharUnicode.charCodeAt(0)]; - - for (var i = 0, j = 0; i < strLen; i++) { - unicode = str.charCodeAt(i); - if (unicode >> 7) { - gbkcode = revCharsTable[unicode] || defaultChar; - newBuf[j++] = gbkcode >> 8; //high byte; - newBuf[j++] = gbkcode & 0xFF; //low byte - } else {//ascii - newBuf[j++] = unicode; - } - } - return newBuf.slice(0, j); -} - -function fromTableEncoding(buf) { - buf = ensureBuffer(buf); - var bufLen = buf.length; - var table = this.options.table; - var newBuf = new Buffer(bufLen*2), unicode, gbkcode, - defaultChar = iconv.defaultCharUnicode.charCodeAt(0); - - for (var i = 0, j = 0; i < bufLen; i++, j+=2) { - gbkcode = buf[i]; - if (gbkcode & 0x80) { - gbkcode = (gbkcode << 8) + buf[++i]; - unicode = table[gbkcode] || defaultChar; - } else { - unicode = gbkcode; - } - newBuf[j] = unicode & 0xFF; //low byte - newBuf[j+1] = unicode >> 8; //high byte - } - return newBuf.slice(0, j).toString('ucs2'); -} - -function toSingleByteEncoding(str) { - str = ensureString(str); - - var buf = new Buffer(str.length); - var revCharsBuf = this.options.revCharsBuf; - for (var i = 0; i < str.length; i++) - buf[i] = revCharsBuf[str.charCodeAt(i)]; - - return buf; -} - -function fromSingleByteEncoding(buf) { - buf = ensureBuffer(buf); - - // Strings are immutable in JS -> we use ucs2 buffer to speed up computations. - var charsBuf = this.options.charsBuf; - var newBuf = new Buffer(buf.length*2); - var idx1 = 0, idx2 = 0; - for (var i = 0, _len = buf.length; i < _len; i++) { - idx1 = buf[i]*2; idx2 = i*2; - newBuf[idx2] = charsBuf[idx1]; - newBuf[idx2+1] = charsBuf[idx1+1]; - } - return newBuf.toString('ucs2'); -} - -// Add aliases to convert functions -iconv.encode = iconv.toEncoding; -iconv.decode = iconv.fromEncoding; - -// Load other encodings manually from files in /encodings dir. -function loadEncodings() { - if (!iconv.encodingsLoaded) { - [ require('./encodings/singlebyte'), - require('./encodings/gbk'), - require('./encodings/big5') - ].forEach(function(encodings) { - for (var key in encodings) - iconv.encodings[key] = encodings[key] - }); - iconv.encodingsLoaded = true; - } -} - - - -// Utilities -var asciiString = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'+ - ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f'; - -var ensureBuffer = function(buf) { - buf = buf || new Buffer(0); - return (buf instanceof Buffer) ? buf : new Buffer(""+buf, "binary"); -} - -var ensureString = function(str) { - str = str || ""; - return (str instanceof Buffer) ? str.toString('utf8') : (""+str); -} - -var getType = function(obj) { - return Object.prototype.toString.call(obj).slice(8, -1); -} - - -},{"./encodings/big5":105,"./encodings/gbk":106,"./encodings/singlebyte":107}],111:[function(require,module,exports){ -module.exports = isTypedArray -isTypedArray.strict = isStrictTypedArray -isTypedArray.loose = isLooseTypedArray - -var toString = Object.prototype.toString -var names = { - '[object Int8Array]': true - , '[object Int16Array]': true - , '[object Int32Array]': true - , '[object Uint8Array]': true - , '[object Uint8ClampedArray]': true - , '[object Uint16Array]': true - , '[object Uint32Array]': true - , '[object Float32Array]': true - , '[object Float64Array]': true -} - -function isTypedArray(arr) { - return ( - isStrictTypedArray(arr) - || isLooseTypedArray(arr) - ) -} - -function isStrictTypedArray(arr) { - return ( - arr instanceof Int8Array - || arr instanceof Int16Array - || arr instanceof Int32Array - || arr instanceof Uint8Array - || arr instanceof Uint8ClampedArray - || arr instanceof Uint16Array - || arr instanceof Uint32Array - || arr instanceof Float32Array - || arr instanceof Float64Array - ) -} - -function isLooseTypedArray(arr) { - return names[toString.call(arr)] -} - -},{}],112:[function(require,module,exports){ -var stream = require('stream') - - -function isStream (obj) { - return obj instanceof stream.Stream -} - - -function isReadable (obj) { - return isStream(obj) && typeof obj._read == 'function' && typeof obj._readableState == 'object' -} - - -function isWritable (obj) { - return isStream(obj) && typeof obj._write == 'function' && typeof obj._writableState == 'object' -} - - -function isDuplex (obj) { - return isReadable(obj) && isWritable(obj) -} - - -module.exports = isStream -module.exports.isReadable = isReadable -module.exports.isWritable = isWritable -module.exports.isDuplex = isDuplex - -},{"stream":undefined}],113:[function(require,module,exports){ -(function(){ - - // Copyright (c) 2005 Tom Wu - // All Rights Reserved. - // See "LICENSE" for details. - - // Basic JavaScript BN library - subset useful for RSA encryption. - - // Bits per digit - var dbits; - - // JavaScript engine analysis - var canary = 0xdeadbeefcafe; - var j_lm = ((canary&0xffffff)==0xefcafe); - - // (public) Constructor - function BigInteger(a,b,c) { - if(a != null) - if("number" == typeof a) this.fromNumber(a,b,c); - else if(b == null && "string" != typeof a) this.fromString(a,256); - else this.fromString(a,b); - } - - // return new, unset BigInteger - function nbi() { return new BigInteger(null); } - - // am: Compute w_j += (x*this_i), propagate carries, - // c is initial carry, returns final carry. - // c < 3*dvalue, x < 2*dvalue, this_i < dvalue - // We need to select the fastest one that works in this environment. - - // am1: use a single mult and divide to get the high bits, - // max digit bits should be 26 because - // max internal value = 2*dvalue^2-2*dvalue (< 2^53) - function am1(i,x,w,j,c,n) { - while(--n >= 0) { - var v = x*this[i++]+w[j]+c; - c = Math.floor(v/0x4000000); - w[j++] = v&0x3ffffff; - } - return c; - } - // am2 avoids a big mult-and-extract completely. - // Max digit bits should be <= 30 because we do bitwise ops - // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) - function am2(i,x,w,j,c,n) { - var xl = x&0x7fff, xh = x>>15; - while(--n >= 0) { - var l = this[i]&0x7fff; - var h = this[i++]>>15; - var m = xh*l+h*xl; - l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff); - c = (l>>>30)+(m>>>15)+xh*h+(c>>>30); - w[j++] = l&0x3fffffff; - } - return c; - } - // Alternately, set max digit bits to 28 since some - // browsers slow down when dealing with 32-bit numbers. - function am3(i,x,w,j,c,n) { - var xl = x&0x3fff, xh = x>>14; - while(--n >= 0) { - var l = this[i]&0x3fff; - var h = this[i++]>>14; - var m = xh*l+h*xl; - l = xl*l+((m&0x3fff)<<14)+w[j]+c; - c = (l>>28)+(m>>14)+xh*h; - w[j++] = l&0xfffffff; - } - return c; - } - var inBrowser = typeof navigator !== "undefined"; - if(inBrowser && j_lm && (navigator.appName == "Microsoft Internet Explorer")) { - BigInteger.prototype.am = am2; - dbits = 30; - } - else if(inBrowser && j_lm && (navigator.appName != "Netscape")) { - BigInteger.prototype.am = am1; - dbits = 26; - } - else { // Mozilla/Netscape seems to prefer am3 - BigInteger.prototype.am = am3; - dbits = 28; - } - - BigInteger.prototype.DB = dbits; - BigInteger.prototype.DM = ((1<= 0; --i) r[i] = this[i]; - r.t = this.t; - r.s = this.s; - } - - // (protected) set from integer value x, -DV <= x < DV - function bnpFromInt(x) { - this.t = 1; - this.s = (x<0)?-1:0; - if(x > 0) this[0] = x; - else if(x < -1) this[0] = x+this.DV; - else this.t = 0; - } - - // return bigint initialized to value - function nbv(i) { var r = nbi(); r.fromInt(i); return r; } - - // (protected) set from string and radix - function bnpFromString(s,b) { - var k; - if(b == 16) k = 4; - else if(b == 8) k = 3; - else if(b == 256) k = 8; // byte array - else if(b == 2) k = 1; - else if(b == 32) k = 5; - else if(b == 4) k = 2; - else { this.fromRadix(s,b); return; } - this.t = 0; - this.s = 0; - var i = s.length, mi = false, sh = 0; - while(--i >= 0) { - var x = (k==8)?s[i]&0xff:intAt(s,i); - if(x < 0) { - if(s.charAt(i) == "-") mi = true; - continue; - } - mi = false; - if(sh == 0) - this[this.t++] = x; - else if(sh+k > this.DB) { - this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<>(this.DB-sh)); - } - else - this[this.t-1] |= x<= this.DB) sh -= this.DB; - } - if(k == 8 && (s[0]&0x80) != 0) { - this.s = -1; - if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)< 0 && this[this.t-1] == c) --this.t; - } - - // (public) return string representation in given radix - function bnToString(b) { - if(this.s < 0) return "-"+this.negate().toString(b); - var k; - if(b == 16) k = 4; - else if(b == 8) k = 3; - else if(b == 2) k = 1; - else if(b == 32) k = 5; - else if(b == 4) k = 2; - else return this.toRadix(b); - var km = (1< 0) { - if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); } - while(i >= 0) { - if(p < k) { - d = (this[i]&((1<>(p+=this.DB-k); - } - else { - d = (this[i]>>(p-=k))&km; - if(p <= 0) { p += this.DB; --i; } - } - if(d > 0) m = true; - if(m) r += int2char(d); - } - } - return m?r:"0"; - } - - // (public) -this - function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; } - - // (public) |this| - function bnAbs() { return (this.s<0)?this.negate():this; } - - // (public) return + if this > a, - if this < a, 0 if equal - function bnCompareTo(a) { - var r = this.s-a.s; - if(r != 0) return r; - var i = this.t; - r = i-a.t; - if(r != 0) return (this.s<0)?-r:r; - while(--i >= 0) if((r=this[i]-a[i]) != 0) return r; - return 0; - } - - // returns bit length of the integer x - function nbits(x) { - var r = 1, t; - if((t=x>>>16) != 0) { x = t; r += 16; } - if((t=x>>8) != 0) { x = t; r += 8; } - if((t=x>>4) != 0) { x = t; r += 4; } - if((t=x>>2) != 0) { x = t; r += 2; } - if((t=x>>1) != 0) { x = t; r += 1; } - return r; - } - - // (public) return the number of bits in "this" - function bnBitLength() { - if(this.t <= 0) return 0; - return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM)); - } - - // (protected) r = this << n*DB - function bnpDLShiftTo(n,r) { - var i; - for(i = this.t-1; i >= 0; --i) r[i+n] = this[i]; - for(i = n-1; i >= 0; --i) r[i] = 0; - r.t = this.t+n; - r.s = this.s; - } - - // (protected) r = this >> n*DB - function bnpDRShiftTo(n,r) { - for(var i = n; i < this.t; ++i) r[i-n] = this[i]; - r.t = Math.max(this.t-n,0); - r.s = this.s; - } - - // (protected) r = this << n - function bnpLShiftTo(n,r) { - var bs = n%this.DB; - var cbs = this.DB-bs; - var bm = (1<= 0; --i) { - r[i+ds+1] = (this[i]>>cbs)|c; - c = (this[i]&bm)<= 0; --i) r[i] = 0; - r[ds] = c; - r.t = this.t+ds+1; - r.s = this.s; - r.clamp(); - } - - // (protected) r = this >> n - function bnpRShiftTo(n,r) { - r.s = this.s; - var ds = Math.floor(n/this.DB); - if(ds >= this.t) { r.t = 0; return; } - var bs = n%this.DB; - var cbs = this.DB-bs; - var bm = (1<>bs; - for(var i = ds+1; i < this.t; ++i) { - r[i-ds-1] |= (this[i]&bm)<>bs; - } - if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<>= this.DB; - } - if(a.t < this.t) { - c -= a.s; - while(i < this.t) { - c += this[i]; - r[i++] = c&this.DM; - c >>= this.DB; - } - c += this.s; - } - else { - c += this.s; - while(i < a.t) { - c -= a[i]; - r[i++] = c&this.DM; - c >>= this.DB; - } - c -= a.s; - } - r.s = (c<0)?-1:0; - if(c < -1) r[i++] = this.DV+c; - else if(c > 0) r[i++] = c; - r.t = i; - r.clamp(); - } - - // (protected) r = this * a, r != this,a (HAC 14.12) - // "this" should be the larger one if appropriate. - function bnpMultiplyTo(a,r) { - var x = this.abs(), y = a.abs(); - var i = x.t; - r.t = i+y.t; - while(--i >= 0) r[i] = 0; - for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t); - r.s = 0; - r.clamp(); - if(this.s != a.s) BigInteger.ZERO.subTo(r,r); - } - - // (protected) r = this^2, r != this (HAC 14.16) - function bnpSquareTo(r) { - var x = this.abs(); - var i = r.t = 2*x.t; - while(--i >= 0) r[i] = 0; - for(i = 0; i < x.t-1; ++i) { - var c = x.am(i,x[i],r,2*i,0,1); - if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) { - r[i+x.t] -= x.DV; - r[i+x.t+1] = 1; - } - } - if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1); - r.s = 0; - r.clamp(); - } - - // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) - // r != q, this != m. q or r may be null. - function bnpDivRemTo(m,q,r) { - var pm = m.abs(); - if(pm.t <= 0) return; - var pt = this.abs(); - if(pt.t < pm.t) { - if(q != null) q.fromInt(0); - if(r != null) this.copyTo(r); - return; - } - if(r == null) r = nbi(); - var y = nbi(), ts = this.s, ms = m.s; - var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus - if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); } - else { pm.copyTo(y); pt.copyTo(r); } - var ys = y.t; - var y0 = y[ys-1]; - if(y0 == 0) return; - var yt = y0*(1<1)?y[ys-2]>>this.F2:0); - var d1 = this.FV/yt, d2 = (1<= 0) { - r[r.t++] = 1; - r.subTo(t,r); - } - BigInteger.ONE.dlShiftTo(ys,t); - t.subTo(y,y); // "negative" y so we can replace sub with am later - while(y.t < ys) y[y.t++] = 0; - while(--j >= 0) { - // Estimate quotient digit - var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2); - if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out - y.dlShiftTo(j,t); - r.subTo(t,r); - while(r[i] < --qd) r.subTo(t,r); - } - } - if(q != null) { - r.drShiftTo(ys,q); - if(ts != ms) BigInteger.ZERO.subTo(q,q); - } - r.t = ys; - r.clamp(); - if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder - if(ts < 0) BigInteger.ZERO.subTo(r,r); - } - - // (public) this mod a - function bnMod(a) { - var r = nbi(); - this.abs().divRemTo(a,null,r); - if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r); - return r; - } - - // Modular reduction using "classic" algorithm - function Classic(m) { this.m = m; } - function cConvert(x) { - if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); - else return x; - } - function cRevert(x) { return x; } - function cReduce(x) { x.divRemTo(this.m,null,x); } - function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } - function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); } - - Classic.prototype.convert = cConvert; - Classic.prototype.revert = cRevert; - Classic.prototype.reduce = cReduce; - Classic.prototype.mulTo = cMulTo; - Classic.prototype.sqrTo = cSqrTo; - - // (protected) return "-1/this % 2^DB"; useful for Mont. reduction - // justification: - // xy == 1 (mod m) - // xy = 1+km - // xy(2-xy) = (1+km)(1-km) - // x[y(2-xy)] = 1-k^2m^2 - // x[y(2-xy)] == 1 (mod m^2) - // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 - // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. - // JS multiply "overflows" differently from C/C++, so care is needed here. - function bnpInvDigit() { - if(this.t < 1) return 0; - var x = this[0]; - if((x&1) == 0) return 0; - var y = x&3; // y == 1/x mod 2^2 - y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4 - y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8 - y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16 - // last step - calculate inverse mod DV directly; - // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints - y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits - // we really want the negative inverse, and -DV < y < DV - return (y>0)?this.DV-y:-y; - } - - // Montgomery reduction - function Montgomery(m) { - this.m = m; - this.mp = m.invDigit(); - this.mpl = this.mp&0x7fff; - this.mph = this.mp>>15; - this.um = (1<<(m.DB-15))-1; - this.mt2 = 2*m.t; - } - - // xR mod m - function montConvert(x) { - var r = nbi(); - x.abs().dlShiftTo(this.m.t,r); - r.divRemTo(this.m,null,r); - if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r); - return r; - } - - // x/R mod m - function montRevert(x) { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; - } - - // x = x/R mod m (HAC 14.32) - function montReduce(x) { - while(x.t <= this.mt2) // pad x so am has enough room later - x[x.t++] = 0; - for(var i = 0; i < this.m.t; ++i) { - // faster way of calculating u0 = x[i]*mp mod DV - var j = x[i]&0x7fff; - var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM; - // use am to combine the multiply-shift-add into one call - j = i+this.m.t; - x[j] += this.m.am(0,u0,x,i,0,this.m.t); - // propagate carry - while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; } - } - x.clamp(); - x.drShiftTo(this.m.t,x); - if(x.compareTo(this.m) >= 0) x.subTo(this.m,x); - } - - // r = "x^2/R mod m"; x != r - function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); } - - // r = "xy/R mod m"; x,y != r - function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } - - Montgomery.prototype.convert = montConvert; - Montgomery.prototype.revert = montRevert; - Montgomery.prototype.reduce = montReduce; - Montgomery.prototype.mulTo = montMulTo; - Montgomery.prototype.sqrTo = montSqrTo; - - // (protected) true iff this is even - function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; } - - // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) - function bnpExp(e,z) { - if(e > 0xffffffff || e < 1) return BigInteger.ONE; - var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1; - g.copyTo(r); - while(--i >= 0) { - z.sqrTo(r,r2); - if((e&(1< 0) z.mulTo(r2,g,r); - else { var t = r; r = r2; r2 = t; } - } - return z.revert(r); - } - - // (public) this^e % m, 0 <= e < 2^32 - function bnModPowInt(e,m) { - var z; - if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m); - return this.exp(e,z); - } - - // protected - BigInteger.prototype.copyTo = bnpCopyTo; - BigInteger.prototype.fromInt = bnpFromInt; - BigInteger.prototype.fromString = bnpFromString; - BigInteger.prototype.clamp = bnpClamp; - BigInteger.prototype.dlShiftTo = bnpDLShiftTo; - BigInteger.prototype.drShiftTo = bnpDRShiftTo; - BigInteger.prototype.lShiftTo = bnpLShiftTo; - BigInteger.prototype.rShiftTo = bnpRShiftTo; - BigInteger.prototype.subTo = bnpSubTo; - BigInteger.prototype.multiplyTo = bnpMultiplyTo; - BigInteger.prototype.squareTo = bnpSquareTo; - BigInteger.prototype.divRemTo = bnpDivRemTo; - BigInteger.prototype.invDigit = bnpInvDigit; - BigInteger.prototype.isEven = bnpIsEven; - BigInteger.prototype.exp = bnpExp; - - // public - BigInteger.prototype.toString = bnToString; - BigInteger.prototype.negate = bnNegate; - BigInteger.prototype.abs = bnAbs; - BigInteger.prototype.compareTo = bnCompareTo; - BigInteger.prototype.bitLength = bnBitLength; - BigInteger.prototype.mod = bnMod; - BigInteger.prototype.modPowInt = bnModPowInt; - - // "constants" - BigInteger.ZERO = nbv(0); - BigInteger.ONE = nbv(1); - - // Copyright (c) 2005-2009 Tom Wu - // All Rights Reserved. - // See "LICENSE" for details. - - // Extended JavaScript BN functions, required for RSA private ops. - - // Version 1.1: new BigInteger("0", 10) returns "proper" zero - // Version 1.2: square() API, isProbablePrime fix - - // (public) - function bnClone() { var r = nbi(); this.copyTo(r); return r; } - - // (public) return value as integer - function bnIntValue() { - if(this.s < 0) { - if(this.t == 1) return this[0]-this.DV; - else if(this.t == 0) return -1; - } - else if(this.t == 1) return this[0]; - else if(this.t == 0) return 0; - // assumes 16 < DB < 32 - return ((this[1]&((1<<(32-this.DB))-1))<>24; } - - // (public) return value as short (assumes DB>=16) - function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; } - - // (protected) return x s.t. r^x < DV - function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); } - - // (public) 0 if this == 0, 1 if this > 0 - function bnSigNum() { - if(this.s < 0) return -1; - else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; - else return 1; - } - - // (protected) convert to radix string - function bnpToRadix(b) { - if(b == null) b = 10; - if(this.signum() == 0 || b < 2 || b > 36) return "0"; - var cs = this.chunkSize(b); - var a = Math.pow(b,cs); - var d = nbv(a), y = nbi(), z = nbi(), r = ""; - this.divRemTo(d,y,z); - while(y.signum() > 0) { - r = (a+z.intValue()).toString(b).substr(1) + r; - y.divRemTo(d,y,z); - } - return z.intValue().toString(b) + r; - } - - // (protected) convert from radix string - function bnpFromRadix(s,b) { - this.fromInt(0); - if(b == null) b = 10; - var cs = this.chunkSize(b); - var d = Math.pow(b,cs), mi = false, j = 0, w = 0; - for(var i = 0; i < s.length; ++i) { - var x = intAt(s,i); - if(x < 0) { - if(s.charAt(i) == "-" && this.signum() == 0) mi = true; - continue; - } - w = b*w+x; - if(++j >= cs) { - this.dMultiply(d); - this.dAddOffset(w,0); - j = 0; - w = 0; - } - } - if(j > 0) { - this.dMultiply(Math.pow(b,j)); - this.dAddOffset(w,0); - } - if(mi) BigInteger.ZERO.subTo(this,this); - } - - // (protected) alternate constructor - function bnpFromNumber(a,b,c) { - if("number" == typeof b) { - // new BigInteger(int,int,RNG) - if(a < 2) this.fromInt(1); - else { - this.fromNumber(a,c); - if(!this.testBit(a-1)) // force MSB set - this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this); - if(this.isEven()) this.dAddOffset(1,0); // force odd - while(!this.isProbablePrime(b)) { - this.dAddOffset(2,0); - if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this); - } - } - } - else { - // new BigInteger(int,RNG) - var x = new Array(), t = a&7; - x.length = (a>>3)+1; - b.nextBytes(x); - if(t > 0) x[0] &= ((1< 0) { - if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p) - r[k++] = d|(this.s<<(this.DB-p)); - while(i >= 0) { - if(p < 8) { - d = (this[i]&((1<>(p+=this.DB-8); - } - else { - d = (this[i]>>(p-=8))&0xff; - if(p <= 0) { p += this.DB; --i; } - } - if((d&0x80) != 0) d |= -256; - if(k == 0 && (this.s&0x80) != (d&0x80)) ++k; - if(k > 0 || d != this.s) r[k++] = d; - } - } - return r; - } - - function bnEquals(a) { return(this.compareTo(a)==0); } - function bnMin(a) { return(this.compareTo(a)<0)?this:a; } - function bnMax(a) { return(this.compareTo(a)>0)?this:a; } - - // (protected) r = this op a (bitwise) - function bnpBitwiseTo(a,op,r) { - var i, f, m = Math.min(a.t,this.t); - for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]); - if(a.t < this.t) { - f = a.s&this.DM; - for(i = m; i < this.t; ++i) r[i] = op(this[i],f); - r.t = this.t; - } - else { - f = this.s&this.DM; - for(i = m; i < a.t; ++i) r[i] = op(f,a[i]); - r.t = a.t; - } - r.s = op(this.s,a.s); - r.clamp(); - } - - // (public) this & a - function op_and(x,y) { return x&y; } - function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; } - - // (public) this | a - function op_or(x,y) { return x|y; } - function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; } - - // (public) this ^ a - function op_xor(x,y) { return x^y; } - function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; } - - // (public) this & ~a - function op_andnot(x,y) { return x&~y; } - function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; } - - // (public) ~this - function bnNot() { - var r = nbi(); - for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i]; - r.t = this.t; - r.s = ~this.s; - return r; - } - - // (public) this << n - function bnShiftLeft(n) { - var r = nbi(); - if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r); - return r; - } - - // (public) this >> n - function bnShiftRight(n) { - var r = nbi(); - if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r); - return r; - } - - // return index of lowest 1-bit in x, x < 2^31 - function lbit(x) { - if(x == 0) return -1; - var r = 0; - if((x&0xffff) == 0) { x >>= 16; r += 16; } - if((x&0xff) == 0) { x >>= 8; r += 8; } - if((x&0xf) == 0) { x >>= 4; r += 4; } - if((x&3) == 0) { x >>= 2; r += 2; } - if((x&1) == 0) ++r; - return r; - } - - // (public) returns index of lowest 1-bit (or -1 if none) - function bnGetLowestSetBit() { - for(var i = 0; i < this.t; ++i) - if(this[i] != 0) return i*this.DB+lbit(this[i]); - if(this.s < 0) return this.t*this.DB; - return -1; - } - - // return number of 1 bits in x - function cbit(x) { - var r = 0; - while(x != 0) { x &= x-1; ++r; } - return r; - } - - // (public) return number of set bits - function bnBitCount() { - var r = 0, x = this.s&this.DM; - for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x); - return r; - } - - // (public) true iff nth bit is set - function bnTestBit(n) { - var j = Math.floor(n/this.DB); - if(j >= this.t) return(this.s!=0); - return((this[j]&(1<<(n%this.DB)))!=0); - } - - // (protected) this op (1<>= this.DB; - } - if(a.t < this.t) { - c += a.s; - while(i < this.t) { - c += this[i]; - r[i++] = c&this.DM; - c >>= this.DB; - } - c += this.s; - } - else { - c += this.s; - while(i < a.t) { - c += a[i]; - r[i++] = c&this.DM; - c >>= this.DB; - } - c += a.s; - } - r.s = (c<0)?-1:0; - if(c > 0) r[i++] = c; - else if(c < -1) r[i++] = this.DV+c; - r.t = i; - r.clamp(); - } - - // (public) this + a - function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; } - - // (public) this - a - function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; } - - // (public) this * a - function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; } - - // (public) this^2 - function bnSquare() { var r = nbi(); this.squareTo(r); return r; } - - // (public) this / a - function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; } - - // (public) this % a - function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; } - - // (public) [this/a,this%a] - function bnDivideAndRemainder(a) { - var q = nbi(), r = nbi(); - this.divRemTo(a,q,r); - return new Array(q,r); - } - - // (protected) this *= n, this >= 0, 1 < n < DV - function bnpDMultiply(n) { - this[this.t] = this.am(0,n-1,this,0,0,this.t); - ++this.t; - this.clamp(); - } - - // (protected) this += n << w words, this >= 0 - function bnpDAddOffset(n,w) { - if(n == 0) return; - while(this.t <= w) this[this.t++] = 0; - this[w] += n; - while(this[w] >= this.DV) { - this[w] -= this.DV; - if(++w >= this.t) this[this.t++] = 0; - ++this[w]; - } - } - - // A "null" reducer - function NullExp() {} - function nNop(x) { return x; } - function nMulTo(x,y,r) { x.multiplyTo(y,r); } - function nSqrTo(x,r) { x.squareTo(r); } - - NullExp.prototype.convert = nNop; - NullExp.prototype.revert = nNop; - NullExp.prototype.mulTo = nMulTo; - NullExp.prototype.sqrTo = nSqrTo; - - // (public) this^e - function bnPow(e) { return this.exp(e,new NullExp()); } - - // (protected) r = lower n words of "this * a", a.t <= n - // "this" should be the larger one if appropriate. - function bnpMultiplyLowerTo(a,n,r) { - var i = Math.min(this.t+a.t,n); - r.s = 0; // assumes a,this >= 0 - r.t = i; - while(i > 0) r[--i] = 0; - var j; - for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t); - for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i); - r.clamp(); - } - - // (protected) r = "this * a" without lower n words, n > 0 - // "this" should be the larger one if appropriate. - function bnpMultiplyUpperTo(a,n,r) { - --n; - var i = r.t = this.t+a.t-n; - r.s = 0; // assumes a,this >= 0 - while(--i >= 0) r[i] = 0; - for(i = Math.max(n-this.t,0); i < a.t; ++i) - r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n); - r.clamp(); - r.drShiftTo(1,r); - } - - // Barrett modular reduction - function Barrett(m) { - // setup Barrett - this.r2 = nbi(); - this.q3 = nbi(); - BigInteger.ONE.dlShiftTo(2*m.t,this.r2); - this.mu = this.r2.divide(m); - this.m = m; - } - - function barrettConvert(x) { - if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m); - else if(x.compareTo(this.m) < 0) return x; - else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } - } - - function barrettRevert(x) { return x; } - - // x = x mod m (HAC 14.42) - function barrettReduce(x) { - x.drShiftTo(this.m.t-1,this.r2); - if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); } - this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3); - this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2); - while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1); - x.subTo(this.r2,x); - while(x.compareTo(this.m) >= 0) x.subTo(this.m,x); - } - - // r = x^2 mod m; x != r - function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); } - - // r = x*y mod m; x,y != r - function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } - - Barrett.prototype.convert = barrettConvert; - Barrett.prototype.revert = barrettRevert; - Barrett.prototype.reduce = barrettReduce; - Barrett.prototype.mulTo = barrettMulTo; - Barrett.prototype.sqrTo = barrettSqrTo; - - // (public) this^e % m (HAC 14.85) - function bnModPow(e,m) { - var i = e.bitLength(), k, r = nbv(1), z; - if(i <= 0) return r; - else if(i < 18) k = 1; - else if(i < 48) k = 3; - else if(i < 144) k = 4; - else if(i < 768) k = 5; - else k = 6; - if(i < 8) - z = new Classic(m); - else if(m.isEven()) - z = new Barrett(m); - else - z = new Montgomery(m); - - // precomputation - var g = new Array(), n = 3, k1 = k-1, km = (1< 1) { - var g2 = nbi(); - z.sqrTo(g[1],g2); - while(n <= km) { - g[n] = nbi(); - z.mulTo(g2,g[n-2],g[n]); - n += 2; - } - } - - var j = e.t-1, w, is1 = true, r2 = nbi(), t; - i = nbits(e[j])-1; - while(j >= 0) { - if(i >= k1) w = (e[j]>>(i-k1))&km; - else { - w = (e[j]&((1<<(i+1))-1))<<(k1-i); - if(j > 0) w |= e[j-1]>>(this.DB+i-k1); - } - - n = k; - while((w&1) == 0) { w >>= 1; --n; } - if((i -= n) < 0) { i += this.DB; --j; } - if(is1) { // ret == 1, don't bother squaring or multiplying it - g[w].copyTo(r); - is1 = false; - } - else { - while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; } - if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; } - z.mulTo(r2,g[w],r); - } - - while(j >= 0 && (e[j]&(1< 0) { - x.rShiftTo(g,x); - y.rShiftTo(g,y); - } - while(x.signum() > 0) { - if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x); - if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y); - if(x.compareTo(y) >= 0) { - x.subTo(y,x); - x.rShiftTo(1,x); - } - else { - y.subTo(x,y); - y.rShiftTo(1,y); - } - } - if(g > 0) y.lShiftTo(g,y); - return y; - } - - // (protected) this % n, n < 2^26 - function bnpModInt(n) { - if(n <= 0) return 0; - var d = this.DV%n, r = (this.s<0)?n-1:0; - if(this.t > 0) - if(d == 0) r = this[0]%n; - else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n; - return r; - } - - // (public) 1/this % m (HAC 14.61) - function bnModInverse(m) { - var ac = m.isEven(); - if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; - var u = m.clone(), v = this.clone(); - var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); - while(u.signum() != 0) { - while(u.isEven()) { - u.rShiftTo(1,u); - if(ac) { - if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); } - a.rShiftTo(1,a); - } - else if(!b.isEven()) b.subTo(m,b); - b.rShiftTo(1,b); - } - while(v.isEven()) { - v.rShiftTo(1,v); - if(ac) { - if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); } - c.rShiftTo(1,c); - } - else if(!d.isEven()) d.subTo(m,d); - d.rShiftTo(1,d); - } - if(u.compareTo(v) >= 0) { - u.subTo(v,u); - if(ac) a.subTo(c,a); - b.subTo(d,b); - } - else { - v.subTo(u,v); - if(ac) c.subTo(a,c); - d.subTo(b,d); - } - } - if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; - if(d.compareTo(m) >= 0) return d.subtract(m); - if(d.signum() < 0) d.addTo(m,d); else return d; - if(d.signum() < 0) return d.add(m); else return d; - } - - var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997]; - var lplim = (1<<26)/lowprimes[lowprimes.length-1]; - - // (public) test primality with certainty >= 1-.5^t - function bnIsProbablePrime(t) { - var i, x = this.abs(); - if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) { - for(i = 0; i < lowprimes.length; ++i) - if(x[0] == lowprimes[i]) return true; - return false; - } - if(x.isEven()) return false; - i = 1; - while(i < lowprimes.length) { - var m = lowprimes[i], j = i+1; - while(j < lowprimes.length && m < lplim) m *= lowprimes[j++]; - m = x.modInt(m); - while(i < j) if(m%lowprimes[i++] == 0) return false; - } - return x.millerRabin(t); - } - - // (protected) true if probably prime (HAC 4.24, Miller-Rabin) - function bnpMillerRabin(t) { - var n1 = this.subtract(BigInteger.ONE); - var k = n1.getLowestSetBit(); - if(k <= 0) return false; - var r = n1.shiftRight(k); - t = (t+1)>>1; - if(t > lowprimes.length) t = lowprimes.length; - var a = nbi(); - for(var i = 0; i < t; ++i) { - //Pick bases at random, instead of starting at 2 - a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]); - var y = a.modPow(r,this); - if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { - var j = 1; - while(j++ < k && y.compareTo(n1) != 0) { - y = y.modPowInt(2,this); - if(y.compareTo(BigInteger.ONE) == 0) return false; - } - if(y.compareTo(n1) != 0) return false; - } - } - return true; - } - - // protected - BigInteger.prototype.chunkSize = bnpChunkSize; - BigInteger.prototype.toRadix = bnpToRadix; - BigInteger.prototype.fromRadix = bnpFromRadix; - BigInteger.prototype.fromNumber = bnpFromNumber; - BigInteger.prototype.bitwiseTo = bnpBitwiseTo; - BigInteger.prototype.changeBit = bnpChangeBit; - BigInteger.prototype.addTo = bnpAddTo; - BigInteger.prototype.dMultiply = bnpDMultiply; - BigInteger.prototype.dAddOffset = bnpDAddOffset; - BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; - BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; - BigInteger.prototype.modInt = bnpModInt; - BigInteger.prototype.millerRabin = bnpMillerRabin; - - // public - BigInteger.prototype.clone = bnClone; - BigInteger.prototype.intValue = bnIntValue; - BigInteger.prototype.byteValue = bnByteValue; - BigInteger.prototype.shortValue = bnShortValue; - BigInteger.prototype.signum = bnSigNum; - BigInteger.prototype.toByteArray = bnToByteArray; - BigInteger.prototype.equals = bnEquals; - BigInteger.prototype.min = bnMin; - BigInteger.prototype.max = bnMax; - BigInteger.prototype.and = bnAnd; - BigInteger.prototype.or = bnOr; - BigInteger.prototype.xor = bnXor; - BigInteger.prototype.andNot = bnAndNot; - BigInteger.prototype.not = bnNot; - BigInteger.prototype.shiftLeft = bnShiftLeft; - BigInteger.prototype.shiftRight = bnShiftRight; - BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; - BigInteger.prototype.bitCount = bnBitCount; - BigInteger.prototype.testBit = bnTestBit; - BigInteger.prototype.setBit = bnSetBit; - BigInteger.prototype.clearBit = bnClearBit; - BigInteger.prototype.flipBit = bnFlipBit; - BigInteger.prototype.add = bnAdd; - BigInteger.prototype.subtract = bnSubtract; - BigInteger.prototype.multiply = bnMultiply; - BigInteger.prototype.divide = bnDivide; - BigInteger.prototype.remainder = bnRemainder; - BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; - BigInteger.prototype.modPow = bnModPow; - BigInteger.prototype.modInverse = bnModInverse; - BigInteger.prototype.pow = bnPow; - BigInteger.prototype.gcd = bnGCD; - BigInteger.prototype.isProbablePrime = bnIsProbablePrime; - - // JSBN-specific extension - BigInteger.prototype.square = bnSquare; - - // Expose the Barrett function - BigInteger.prototype.Barrett = Barrett - - // BigInteger interfaces not implemented in jsbn: - - // BigInteger(int signum, byte[] magnitude) - // double doubleValue() - // float floatValue() - // int hashCode() - // long longValue() - // static BigInteger valueOf(long val) - - // Random number generator - requires a PRNG backend, e.g. prng4.js - - // For best results, put code like - // - // in your main HTML document. - - var rng_state; - var rng_pool; - var rng_pptr; - - // Mix in a 32-bit integer into the pool - function rng_seed_int(x) { - rng_pool[rng_pptr++] ^= x & 255; - rng_pool[rng_pptr++] ^= (x >> 8) & 255; - rng_pool[rng_pptr++] ^= (x >> 16) & 255; - rng_pool[rng_pptr++] ^= (x >> 24) & 255; - if(rng_pptr >= rng_psize) rng_pptr -= rng_psize; - } - - // Mix in the current time (w/milliseconds) into the pool - function rng_seed_time() { - rng_seed_int(new Date().getTime()); - } - - // Initialize the pool with junk if needed. - if(rng_pool == null) { - rng_pool = new Array(); - rng_pptr = 0; - var t; - if(typeof window !== "undefined" && window.crypto) { - if (window.crypto.getRandomValues) { - // Use webcrypto if available - var ua = new Uint8Array(32); - window.crypto.getRandomValues(ua); - for(t = 0; t < 32; ++t) - rng_pool[rng_pptr++] = ua[t]; - } - else if(navigator.appName == "Netscape" && navigator.appVersion < "5") { - // Extract entropy (256 bits) from NS4 RNG if available - var z = window.crypto.random(32); - for(t = 0; t < z.length; ++t) - rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; - } - } - while(rng_pptr < rng_psize) { // extract some randomness from Math.random() - t = Math.floor(65536 * Math.random()); - rng_pool[rng_pptr++] = t >>> 8; - rng_pool[rng_pptr++] = t & 255; - } - rng_pptr = 0; - rng_seed_time(); - //rng_seed_int(window.screenX); - //rng_seed_int(window.screenY); - } - - function rng_get_byte() { - if(rng_state == null) { - rng_seed_time(); - rng_state = prng_newstate(); - rng_state.init(rng_pool); - for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) - rng_pool[rng_pptr] = 0; - rng_pptr = 0; - //rng_pool = null; - } - // TODO: allow reseeding after first request - return rng_state.next(); - } - - function rng_get_bytes(ba) { - var i; - for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); - } - - function SecureRandom() {} - - SecureRandom.prototype.nextBytes = rng_get_bytes; - - // prng4.js - uses Arcfour as a PRNG - - function Arcfour() { - this.i = 0; - this.j = 0; - this.S = new Array(); - } - - // Initialize arcfour context from key, an array of ints, each from [0..255] - function ARC4init(key) { - var i, j, t; - for(i = 0; i < 256; ++i) - this.S[i] = i; - j = 0; - for(i = 0; i < 256; ++i) { - j = (j + this.S[i] + key[i % key.length]) & 255; - t = this.S[i]; - this.S[i] = this.S[j]; - this.S[j] = t; - } - this.i = 0; - this.j = 0; - } - - function ARC4next() { - var t; - this.i = (this.i + 1) & 255; - this.j = (this.j + this.S[this.i]) & 255; - t = this.S[this.i]; - this.S[this.i] = this.S[this.j]; - this.S[this.j] = t; - return this.S[(t + this.S[this.i]) & 255]; - } - - Arcfour.prototype.init = ARC4init; - Arcfour.prototype.next = ARC4next; - - // Plug in your RNG constructor here - function prng_newstate() { - return new Arcfour(); - } - - // Pool size must be a multiple of 4 and greater than 32. - // An array of bytes the size of the pool will be passed to init() - var rng_psize = 256; - - BigInteger.SecureRandom = SecureRandom; - BigInteger.BigInteger = BigInteger; - if (typeof exports !== 'undefined') { - exports = module.exports = BigInteger; - } else { - this.BigInteger = BigInteger; - this.SecureRandom = SecureRandom; - } - -}).call(this); - -},{}],114:[function(require,module,exports){ -'use strict'; - -var traverse = module.exports = function (schema, opts, cb) { - if (typeof opts == 'function') { - cb = opts; - opts = {}; - } - _traverse(opts, cb, schema, '', schema); -}; - - -traverse.keywords = { - additionalItems: true, - items: true, - contains: true, - additionalProperties: true, - propertyNames: true, - not: true -}; - -traverse.arrayKeywords = { - items: true, - allOf: true, - anyOf: true, - oneOf: true -}; - -traverse.propsKeywords = { - definitions: true, - properties: true, - patternProperties: true, - dependencies: true -}; - -traverse.skipKeywords = { - enum: true, - const: true, - required: true, - maximum: true, - minimum: true, - exclusiveMaximum: true, - exclusiveMinimum: true, - multipleOf: true, - maxLength: true, - minLength: true, - pattern: true, - format: true, - maxItems: true, - minItems: true, - uniqueItems: true, - maxProperties: true, - minProperties: true -}; - - -function _traverse(opts, cb, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { - if (schema && typeof schema == 'object' && !Array.isArray(schema)) { - cb(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); - for (var key in schema) { - var sch = schema[key]; - if (Array.isArray(sch)) { - if (key in traverse.arrayKeywords) { - for (var i=0; i schema.maxItems){ - addError("There must be a maximum of " + schema.maxItems + " in the array"); - } - }else if(schema.properties || schema.additionalProperties){ - errors.concat(checkObj(value, schema.properties, path, schema.additionalProperties)); - } - if(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){ - addError("does not match the regex pattern " + schema.pattern); - } - if(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){ - addError("may only be " + schema.maxLength + " characters long"); - } - if(schema.minLength && typeof value == 'string' && value.length < schema.minLength){ - addError("must be at least " + schema.minLength + " characters long"); - } - if(typeof schema.minimum !== undefined && typeof value == typeof schema.minimum && - schema.minimum > value){ - addError("must have a minimum value of " + schema.minimum); - } - if(typeof schema.maximum !== undefined && typeof value == typeof schema.maximum && - schema.maximum < value){ - addError("must have a maximum value of " + schema.maximum); - } - if(schema['enum']){ - var enumer = schema['enum']; - l = enumer.length; - var found; - for(var j = 0; j < l; j++){ - if(enumer[j]===value){ - found=1; - break; - } - } - if(!found){ - addError("does not have a value in the enumeration " + enumer.join(", ")); - } - } - if(typeof schema.maxDecimal == 'number' && - (value.toString().match(new RegExp("\\.[0-9]{" + (schema.maxDecimal + 1) + ",}")))){ - addError("may only have " + schema.maxDecimal + " digits of decimal places"); - } - } - } - return null; - } - // validate an object against a schema - function checkObj(instance,objTypeDef,path,additionalProp){ - - if(typeof objTypeDef =='object'){ - if(typeof instance != 'object' || instance instanceof Array){ - errors.push({property:path,message:"an object is required"}); - } - - for(var i in objTypeDef){ - if(objTypeDef.hasOwnProperty(i)){ - var value = instance[i]; - // skip _not_ specified properties - if (value === undefined && options.existingOnly) continue; - var propDef = objTypeDef[i]; - // set default - if(value === undefined && propDef["default"]){ - value = instance[i] = propDef["default"]; - } - if(options.coerce && i in instance){ - value = instance[i] = options.coerce(value, propDef); - } - checkProp(value,propDef,path,i); - } - } - } - for(i in instance){ - if(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){ - if (options.filter) { - delete instance[i]; - continue; - } else { - errors.push({property:path,message:(typeof value) + "The property " + i + - " is not defined in the schema and the schema does not allow additional properties"}); - } - } - var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires; - if(requires && !(requires in instance)){ - errors.push({property:path,message:"the presence of the property " + i + " requires that " + requires + " also be present"}); - } - value = instance[i]; - if(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){ - if(options.coerce){ - value = instance[i] = options.coerce(value, additionalProp); - } - checkProp(value,additionalProp,path,i); - } - if(!_changing && value && value.$schema){ - errors = errors.concat(checkProp(value,value.$schema,path,i)); - } - } - return errors; - } - if(schema){ - checkProp(instance,schema,'',_changing || ''); - } - if(!_changing && instance && instance.$schema){ - checkProp(instance,instance.$schema,'',''); - } - return {valid:!errors.length,errors:errors}; -}; -exports.mustBeValid = function(result){ - // summary: - // This checks to ensure that the result is valid and will throw an appropriate error message if it is not - // result: the result returned from checkPropertyChange or validate - if(!result.valid){ - throw new TypeError(result.errors.map(function(error){return "for property " + error.property + ': ' + error.message;}).join(", \n")); - } -} - -return exports; -})); - -},{}],116:[function(require,module,exports){ -exports = module.exports = stringify -exports.getSerialize = serializer - -function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces) -} - -function serializer(replacer, cycleReplacer) { - var stack = [], keys = [] - - if (cycleReplacer == null) cycleReplacer = function(key, value) { - if (stack[0] === value) return "[Circular ~]" - return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]" - } - - return function(key, value) { - if (stack.length > 0) { - var thisPos = stack.indexOf(this) - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this) - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key) - if (~stack.indexOf(value)) value = cycleReplacer.call(this, key, value) - } - else stack.push(value) - - return replacer == null ? value : replacer.call(this, key, value) - } -} - -},{}],117:[function(require,module,exports){ -/* - * lib/jsprim.js: utilities for primitive JavaScript types - */ - -var mod_assert = require('assert-plus'); -var mod_util = require('util'); - -var mod_extsprintf = require('extsprintf'); -var mod_verror = require('verror'); -var mod_jsonschema = require('json-schema'); - -/* - * Public interface - */ -exports.deepCopy = deepCopy; -exports.deepEqual = deepEqual; -exports.isEmpty = isEmpty; -exports.hasKey = hasKey; -exports.forEachKey = forEachKey; -exports.pluck = pluck; -exports.flattenObject = flattenObject; -exports.flattenIter = flattenIter; -exports.validateJsonObject = validateJsonObjectJS; -exports.validateJsonObjectJS = validateJsonObjectJS; -exports.randElt = randElt; -exports.extraProperties = extraProperties; -exports.mergeObjects = mergeObjects; - -exports.startsWith = startsWith; -exports.endsWith = endsWith; - -exports.parseInteger = parseInteger; - -exports.iso8601 = iso8601; -exports.rfc1123 = rfc1123; -exports.parseDateTime = parseDateTime; - -exports.hrtimediff = hrtimeDiff; -exports.hrtimeDiff = hrtimeDiff; -exports.hrtimeAccum = hrtimeAccum; -exports.hrtimeAdd = hrtimeAdd; -exports.hrtimeNanosec = hrtimeNanosec; -exports.hrtimeMicrosec = hrtimeMicrosec; -exports.hrtimeMillisec = hrtimeMillisec; - - -/* - * Deep copy an acyclic *basic* Javascript object. This only handles basic - * scalars (strings, numbers, booleans) and arbitrarily deep arrays and objects - * containing these. This does *not* handle instances of other classes. - */ -function deepCopy(obj) -{ - var ret, key; - var marker = '__deepCopy'; - - if (obj && obj[marker]) - throw (new Error('attempted deep copy of cyclic object')); - - if (obj && obj.constructor == Object) { - ret = {}; - obj[marker] = true; - - for (key in obj) { - if (key == marker) - continue; - - ret[key] = deepCopy(obj[key]); - } - - delete (obj[marker]); - return (ret); - } - - if (obj && obj.constructor == Array) { - ret = []; - obj[marker] = true; - - for (key = 0; key < obj.length; key++) - ret.push(deepCopy(obj[key])); - - delete (obj[marker]); - return (ret); - } - - /* - * It must be a primitive type -- just return it. - */ - return (obj); -} - -function deepEqual(obj1, obj2) -{ - if (typeof (obj1) != typeof (obj2)) - return (false); - - if (obj1 === null || obj2 === null || typeof (obj1) != 'object') - return (obj1 === obj2); - - if (obj1.constructor != obj2.constructor) - return (false); - - var k; - for (k in obj1) { - if (!obj2.hasOwnProperty(k)) - return (false); - - if (!deepEqual(obj1[k], obj2[k])) - return (false); - } - - for (k in obj2) { - if (!obj1.hasOwnProperty(k)) - return (false); - } - - return (true); -} - -function isEmpty(obj) -{ - var key; - for (key in obj) - return (false); - return (true); -} - -function hasKey(obj, key) -{ - mod_assert.equal(typeof (key), 'string'); - return (Object.prototype.hasOwnProperty.call(obj, key)); -} - -function forEachKey(obj, callback) -{ - for (var key in obj) { - if (hasKey(obj, key)) { - callback(key, obj[key]); - } - } -} - -function pluck(obj, key) -{ - mod_assert.equal(typeof (key), 'string'); - return (pluckv(obj, key)); -} - -function pluckv(obj, key) -{ - if (obj === null || typeof (obj) !== 'object') - return (undefined); - - if (obj.hasOwnProperty(key)) - return (obj[key]); - - var i = key.indexOf('.'); - if (i == -1) - return (undefined); - - var key1 = key.substr(0, i); - if (!obj.hasOwnProperty(key1)) - return (undefined); - - return (pluckv(obj[key1], key.substr(i + 1))); -} - -/* - * Invoke callback(row) for each entry in the array that would be returned by - * flattenObject(data, depth). This is just like flattenObject(data, - * depth).forEach(callback), except that the intermediate array is never - * created. - */ -function flattenIter(data, depth, callback) -{ - doFlattenIter(data, depth, [], callback); -} - -function doFlattenIter(data, depth, accum, callback) -{ - var each; - var key; - - if (depth === 0) { - each = accum.slice(0); - each.push(data); - callback(each); - return; - } - - mod_assert.ok(data !== null); - mod_assert.equal(typeof (data), 'object'); - mod_assert.equal(typeof (depth), 'number'); - mod_assert.ok(depth >= 0); - - for (key in data) { - each = accum.slice(0); - each.push(key); - doFlattenIter(data[key], depth - 1, each, callback); - } -} - -function flattenObject(data, depth) -{ - if (depth === 0) - return ([ data ]); - - mod_assert.ok(data !== null); - mod_assert.equal(typeof (data), 'object'); - mod_assert.equal(typeof (depth), 'number'); - mod_assert.ok(depth >= 0); - - var rv = []; - var key; - - for (key in data) { - flattenObject(data[key], depth - 1).forEach(function (p) { - rv.push([ key ].concat(p)); - }); - } - - return (rv); -} - -function startsWith(str, prefix) -{ - return (str.substr(0, prefix.length) == prefix); -} - -function endsWith(str, suffix) -{ - return (str.substr( - str.length - suffix.length, suffix.length) == suffix); -} - -function iso8601(d) -{ - if (typeof (d) == 'number') - d = new Date(d); - mod_assert.ok(d.constructor === Date); - return (mod_extsprintf.sprintf('%4d-%02d-%02dT%02d:%02d:%02d.%03dZ', - d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), - d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), - d.getUTCMilliseconds())); -} - -var RFC1123_MONTHS = [ - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; -var RFC1123_DAYS = [ - 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; - -function rfc1123(date) { - return (mod_extsprintf.sprintf('%s, %02d %s %04d %02d:%02d:%02d GMT', - RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(), - RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(), - date.getUTCHours(), date.getUTCMinutes(), - date.getUTCSeconds())); -} - -/* - * Parses a date expressed as a string, as either a number of milliseconds since - * the epoch or any string format that Date accepts, giving preference to the - * former where these two sets overlap (e.g., small numbers). - */ -function parseDateTime(str) -{ - /* - * This is irritatingly implicit, but significantly more concise than - * alternatives. The "+str" will convert a string containing only a - * number directly to a Number, or NaN for other strings. Thus, if the - * conversion succeeds, we use it (this is the milliseconds-since-epoch - * case). Otherwise, we pass the string directly to the Date - * constructor to parse. - */ - var numeric = +str; - if (!isNaN(numeric)) { - return (new Date(numeric)); - } else { - return (new Date(str)); - } -} - - -/* - * Number.*_SAFE_INTEGER isn't present before node v0.12, so we hardcode - * the ES6 definitions here, while allowing for them to someday be higher. - */ -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; -var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; - - -/* - * Default options for parseInteger(). - */ -var PI_DEFAULTS = { - base: 10, - allowSign: true, - allowPrefix: false, - allowTrailing: false, - allowImprecise: false, - trimWhitespace: false, - leadingZeroIsOctal: false -}; - -var CP_0 = 0x30; -var CP_9 = 0x39; - -var CP_A = 0x41; -var CP_B = 0x42; -var CP_O = 0x4f; -var CP_T = 0x54; -var CP_X = 0x58; -var CP_Z = 0x5a; - -var CP_a = 0x61; -var CP_b = 0x62; -var CP_o = 0x6f; -var CP_t = 0x74; -var CP_x = 0x78; -var CP_z = 0x7a; - -var PI_CONV_DEC = 0x30; -var PI_CONV_UC = 0x37; -var PI_CONV_LC = 0x57; - - -/* - * A stricter version of parseInt() that provides options for changing what - * is an acceptable string (for example, disallowing trailing characters). - */ -function parseInteger(str, uopts) -{ - mod_assert.string(str, 'str'); - mod_assert.optionalObject(uopts, 'options'); - - var baseOverride = false; - var options = PI_DEFAULTS; - - if (uopts) { - baseOverride = hasKey(uopts, 'base'); - options = mergeObjects(options, uopts); - mod_assert.number(options.base, 'options.base'); - mod_assert.ok(options.base >= 2, 'options.base >= 2'); - mod_assert.ok(options.base <= 36, 'options.base <= 36'); - mod_assert.bool(options.allowSign, 'options.allowSign'); - mod_assert.bool(options.allowPrefix, 'options.allowPrefix'); - mod_assert.bool(options.allowTrailing, - 'options.allowTrailing'); - mod_assert.bool(options.allowImprecise, - 'options.allowImprecise'); - mod_assert.bool(options.trimWhitespace, - 'options.trimWhitespace'); - mod_assert.bool(options.leadingZeroIsOctal, - 'options.leadingZeroIsOctal'); - - if (options.leadingZeroIsOctal) { - mod_assert.ok(!baseOverride, - '"base" and "leadingZeroIsOctal" are ' + - 'mutually exclusive'); - } - } - - var c; - var pbase = -1; - var base = options.base; - var start; - var mult = 1; - var value = 0; - var idx = 0; - var len = str.length; - - /* Trim any whitespace on the left side. */ - if (options.trimWhitespace) { - while (idx < len && isSpace(str.charCodeAt(idx))) { - ++idx; - } - } - - /* Check the number for a leading sign. */ - if (options.allowSign) { - if (str[idx] === '-') { - idx += 1; - mult = -1; - } else if (str[idx] === '+') { - idx += 1; - } - } - - /* Parse the base-indicating prefix if there is one. */ - if (str[idx] === '0') { - if (options.allowPrefix) { - pbase = prefixToBase(str.charCodeAt(idx + 1)); - if (pbase !== -1 && (!baseOverride || pbase === base)) { - base = pbase; - idx += 2; - } - } - - if (pbase === -1 && options.leadingZeroIsOctal) { - base = 8; - } - } - - /* Parse the actual digits. */ - for (start = idx; idx < len; ++idx) { - c = translateDigit(str.charCodeAt(idx)); - if (c !== -1 && c < base) { - value *= base; - value += c; - } else { - break; - } - } - - /* If we didn't parse any digits, we have an invalid number. */ - if (start === idx) { - return (new Error('invalid number: ' + JSON.stringify(str))); - } - - /* Trim any whitespace on the right side. */ - if (options.trimWhitespace) { - while (idx < len && isSpace(str.charCodeAt(idx))) { - ++idx; - } - } - - /* Check for trailing characters. */ - if (idx < len && !options.allowTrailing) { - return (new Error('trailing characters after number: ' + - JSON.stringify(str.slice(idx)))); - } - - /* If our value is 0, we return now, to avoid returning -0. */ - if (value === 0) { - return (0); - } - - /* Calculate our final value. */ - var result = value * mult; - - /* - * If the string represents a value that cannot be precisely represented - * by JavaScript, then we want to check that: - * - * - We never increased the value past MAX_SAFE_INTEGER - * - We don't make the result negative and below MIN_SAFE_INTEGER - * - * Because we only ever increment the value during parsing, there's no - * chance of moving past MAX_SAFE_INTEGER and then dropping below it - * again, losing precision in the process. This means that we only need - * to do our checks here, at the end. - */ - if (!options.allowImprecise && - (value > MAX_SAFE_INTEGER || result < MIN_SAFE_INTEGER)) { - return (new Error('number is outside of the supported range: ' + - JSON.stringify(str.slice(start, idx)))); - } - - return (result); -} - - -/* - * Interpret a character code as a base-36 digit. - */ -function translateDigit(d) -{ - if (d >= CP_0 && d <= CP_9) { - /* '0' to '9' -> 0 to 9 */ - return (d - PI_CONV_DEC); - } else if (d >= CP_A && d <= CP_Z) { - /* 'A' - 'Z' -> 10 to 35 */ - return (d - PI_CONV_UC); - } else if (d >= CP_a && d <= CP_z) { - /* 'a' - 'z' -> 10 to 35 */ - return (d - PI_CONV_LC); - } else { - /* Invalid character code */ - return (-1); - } -} - - -/* - * Test if a value matches the ECMAScript definition of trimmable whitespace. - */ -function isSpace(c) -{ - return (c === 0x20) || - (c >= 0x0009 && c <= 0x000d) || - (c === 0x00a0) || - (c === 0x1680) || - (c === 0x180e) || - (c >= 0x2000 && c <= 0x200a) || - (c === 0x2028) || - (c === 0x2029) || - (c === 0x202f) || - (c === 0x205f) || - (c === 0x3000) || - (c === 0xfeff); -} - - -/* - * Determine which base a character indicates (e.g., 'x' indicates hex). - */ -function prefixToBase(c) -{ - if (c === CP_b || c === CP_B) { - /* 0b/0B (binary) */ - return (2); - } else if (c === CP_o || c === CP_O) { - /* 0o/0O (octal) */ - return (8); - } else if (c === CP_t || c === CP_T) { - /* 0t/0T (decimal) */ - return (10); - } else if (c === CP_x || c === CP_X) { - /* 0x/0X (hexadecimal) */ - return (16); - } else { - /* Not a meaningful character */ - return (-1); - } -} - - -function validateJsonObjectJS(schema, input) -{ - var report = mod_jsonschema.validate(input, schema); - - if (report.errors.length === 0) - return (null); - - /* Currently, we only do anything useful with the first error. */ - var error = report.errors[0]; - - /* The failed property is given by a URI with an irrelevant prefix. */ - var propname = error['property']; - var reason = error['message'].toLowerCase(); - var i, j; - - /* - * There's at least one case where the property error message is - * confusing at best. We work around this here. - */ - if ((i = reason.indexOf('the property ')) != -1 && - (j = reason.indexOf(' is not defined in the schema and the ' + - 'schema does not allow additional properties')) != -1) { - i += 'the property '.length; - if (propname === '') - propname = reason.substr(i, j - i); - else - propname = propname + '.' + reason.substr(i, j - i); - - reason = 'unsupported property'; - } - - var rv = new mod_verror.VError('property "%s": %s', propname, reason); - rv.jsv_details = error; - return (rv); -} - -function randElt(arr) -{ - mod_assert.ok(Array.isArray(arr) && arr.length > 0, - 'randElt argument must be a non-empty array'); - - return (arr[Math.floor(Math.random() * arr.length)]); -} - -function assertHrtime(a) -{ - mod_assert.ok(a[0] >= 0 && a[1] >= 0, - 'negative numbers not allowed in hrtimes'); - mod_assert.ok(a[1] < 1e9, 'nanoseconds column overflow'); -} - -/* - * Compute the time elapsed between hrtime readings A and B, where A is later - * than B. hrtime readings come from Node's process.hrtime(). There is no - * defined way to represent negative deltas, so it's illegal to diff B from A - * where the time denoted by B is later than the time denoted by A. If this - * becomes valuable, we can define a representation and extend the - * implementation to support it. - */ -function hrtimeDiff(a, b) -{ - assertHrtime(a); - assertHrtime(b); - mod_assert.ok(a[0] > b[0] || (a[0] == b[0] && a[1] >= b[1]), - 'negative differences not allowed'); - - var rv = [ a[0] - b[0], 0 ]; - - if (a[1] >= b[1]) { - rv[1] = a[1] - b[1]; - } else { - rv[0]--; - rv[1] = 1e9 - (b[1] - a[1]); - } - - return (rv); -} - -/* - * Convert a hrtime reading from the array format returned by Node's - * process.hrtime() into a scalar number of nanoseconds. - */ -function hrtimeNanosec(a) -{ - assertHrtime(a); - - return (Math.floor(a[0] * 1e9 + a[1])); -} - -/* - * Convert a hrtime reading from the array format returned by Node's - * process.hrtime() into a scalar number of microseconds. - */ -function hrtimeMicrosec(a) -{ - assertHrtime(a); - - return (Math.floor(a[0] * 1e6 + a[1] / 1e3)); -} - -/* - * Convert a hrtime reading from the array format returned by Node's - * process.hrtime() into a scalar number of milliseconds. - */ -function hrtimeMillisec(a) -{ - assertHrtime(a); - - return (Math.floor(a[0] * 1e3 + a[1] / 1e6)); -} - -/* - * Add two hrtime readings A and B, overwriting A with the result of the - * addition. This function is useful for accumulating several hrtime intervals - * into a counter. Returns A. - */ -function hrtimeAccum(a, b) -{ - assertHrtime(a); - assertHrtime(b); - - /* - * Accumulate the nanosecond component. - */ - a[1] += b[1]; - if (a[1] >= 1e9) { - /* - * The nanosecond component overflowed, so carry to the seconds - * field. - */ - a[0]++; - a[1] -= 1e9; - } - - /* - * Accumulate the seconds component. - */ - a[0] += b[0]; - - return (a); -} - -/* - * Add two hrtime readings A and B, returning the result as a new hrtime array. - * Does not modify either input argument. - */ -function hrtimeAdd(a, b) -{ - assertHrtime(a); - - var rv = [ a[0], a[1] ]; - - return (hrtimeAccum(rv, b)); -} - - -/* - * Check an object for unexpected properties. Accepts the object to check, and - * an array of allowed property names (strings). Returns an array of key names - * that were found on the object, but did not appear in the list of allowed - * properties. If no properties were found, the returned array will be of - * zero length. - */ -function extraProperties(obj, allowed) -{ - mod_assert.ok(typeof (obj) === 'object' && obj !== null, - 'obj argument must be a non-null object'); - mod_assert.ok(Array.isArray(allowed), - 'allowed argument must be an array of strings'); - for (var i = 0; i < allowed.length; i++) { - mod_assert.ok(typeof (allowed[i]) === 'string', - 'allowed argument must be an array of strings'); - } - - return (Object.keys(obj).filter(function (key) { - return (allowed.indexOf(key) === -1); - })); -} - -/* - * Given three sets of properties "provided" (may be undefined), "overrides" - * (required), and "defaults" (may be undefined), construct an object containing - * the union of these sets with "overrides" overriding "provided", and - * "provided" overriding "defaults". None of the input objects are modified. - */ -function mergeObjects(provided, overrides, defaults) -{ - var rv, k; - - rv = {}; - if (defaults) { - for (k in defaults) - rv[k] = defaults[k]; - } - - if (provided) { - for (k in provided) - rv[k] = provided[k]; - } - - if (overrides) { - for (k in overrides) - rv[k] = overrides[k]; - } - - return (rv); -} - -},{"assert-plus":118,"extsprintf":82,"json-schema":115,"util":undefined,"verror":214}],118:[function(require,module,exports){ -// Copyright (c) 2012, Mark Cavage. All rights reserved. -// Copyright 2015 Joyent, Inc. - -var assert = require('assert'); -var Stream = require('stream').Stream; -var util = require('util'); - - -///--- Globals - -/* JSSTYLED */ -var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; - - -///--- Internal - -function _capitalize(str) { - return (str.charAt(0).toUpperCase() + str.slice(1)); -} - -function _toss(name, expected, oper, arg, actual) { - throw new assert.AssertionError({ - message: util.format('%s (%s) is required', name, expected), - actual: (actual === undefined) ? typeof (arg) : actual(arg), - expected: expected, - operator: oper || '===', - stackStartFunction: _toss.caller - }); -} - -function _getClass(arg) { - return (Object.prototype.toString.call(arg).slice(8, -1)); -} - -function noop() { - // Why even bother with asserts? -} - - -///--- Exports - -var types = { - bool: { - check: function (arg) { return typeof (arg) === 'boolean'; } - }, - func: { - check: function (arg) { return typeof (arg) === 'function'; } - }, - string: { - check: function (arg) { return typeof (arg) === 'string'; } - }, - object: { - check: function (arg) { - return typeof (arg) === 'object' && arg !== null; - } - }, - number: { - check: function (arg) { - return typeof (arg) === 'number' && !isNaN(arg); - } - }, - finite: { - check: function (arg) { - return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); - } - }, - buffer: { - check: function (arg) { return Buffer.isBuffer(arg); }, - operator: 'Buffer.isBuffer' - }, - array: { - check: function (arg) { return Array.isArray(arg); }, - operator: 'Array.isArray' - }, - stream: { - check: function (arg) { return arg instanceof Stream; }, - operator: 'instanceof', - actual: _getClass - }, - date: { - check: function (arg) { return arg instanceof Date; }, - operator: 'instanceof', - actual: _getClass - }, - regexp: { - check: function (arg) { return arg instanceof RegExp; }, - operator: 'instanceof', - actual: _getClass - }, - uuid: { - check: function (arg) { - return typeof (arg) === 'string' && UUID_REGEXP.test(arg); - }, - operator: 'isUUID' - } -}; - -function _setExports(ndebug) { - var keys = Object.keys(types); - var out; - - /* re-export standard assert */ - if (process.env.NODE_NDEBUG) { - out = noop; - } else { - out = function (arg, msg) { - if (!arg) { - _toss(msg, 'true', arg); - } - }; - } - - /* standard checks */ - keys.forEach(function (k) { - if (ndebug) { - out[k] = noop; - return; - } - var type = types[k]; - out[k] = function (arg, msg) { - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - - /* optional checks */ - keys.forEach(function (k) { - var name = 'optional' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - - /* arrayOf checks */ - keys.forEach(function (k) { - var name = 'arrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; - }); - - /* optionalArrayOf checks */ - keys.forEach(function (k) { - var name = 'optionalArrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; - }); - - /* re-export built-in assertions */ - Object.keys(assert).forEach(function (k) { - if (k === 'AssertionError') { - out[k] = assert[k]; - return; - } - if (ndebug) { - out[k] = noop; - return; - } - out[k] = assert[k]; - }); - - /* export ourselves (for unit tests _only_) */ - out._setExports = _setExports; - - return out; -} - -module.exports = _setExports(process.env.NODE_NDEBUG); - -},{"assert":undefined,"stream":undefined,"util":undefined}],119:[function(require,module,exports){ -module.exports={ - "application/1d-interleaved-parityfec": { - "source": "iana" - }, - "application/3gpdash-qoe-report+xml": { - "source": "iana" - }, - "application/3gpp-ims+xml": { - "source": "iana" - }, - "application/a2l": { - "source": "iana" - }, - "application/activemessage": { - "source": "iana" - }, - "application/alto-costmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-costmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/alto-directory+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcost+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcostparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointprop+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointpropparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-error+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/aml": { - "source": "iana" - }, - "application/andrew-inset": { - "source": "iana", - "extensions": ["ez"] - }, - "application/applefile": { - "source": "iana" - }, - "application/applixware": { - "source": "apache", - "extensions": ["aw"] - }, - "application/atf": { - "source": "iana" - }, - "application/atfx": { - "source": "iana" - }, - "application/atom+xml": { - "source": "iana", - "compressible": true, - "extensions": ["atom"] - }, - "application/atomcat+xml": { - "source": "iana", - "extensions": ["atomcat"] - }, - "application/atomdeleted+xml": { - "source": "iana" - }, - "application/atomicmail": { - "source": "iana" - }, - "application/atomsvc+xml": { - "source": "iana", - "extensions": ["atomsvc"] - }, - "application/atxml": { - "source": "iana" - }, - "application/auth-policy+xml": { - "source": "iana" - }, - "application/bacnet-xdd+zip": { - "source": "iana" - }, - "application/batch-smtp": { - "source": "iana" - }, - "application/bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/beep+xml": { - "source": "iana" - }, - "application/calendar+json": { - "source": "iana", - "compressible": true - }, - "application/calendar+xml": { - "source": "iana" - }, - "application/call-completion": { - "source": "iana" - }, - "application/cals-1840": { - "source": "iana" - }, - "application/cbor": { - "source": "iana" - }, - "application/cccex": { - "source": "iana" - }, - "application/ccmp+xml": { - "source": "iana" - }, - "application/ccxml+xml": { - "source": "iana", - "extensions": ["ccxml"] - }, - "application/cdfx+xml": { - "source": "iana" - }, - "application/cdmi-capability": { - "source": "iana", - "extensions": ["cdmia"] - }, - "application/cdmi-container": { - "source": "iana", - "extensions": ["cdmic"] - }, - "application/cdmi-domain": { - "source": "iana", - "extensions": ["cdmid"] - }, - "application/cdmi-object": { - "source": "iana", - "extensions": ["cdmio"] - }, - "application/cdmi-queue": { - "source": "iana", - "extensions": ["cdmiq"] - }, - "application/cdni": { - "source": "iana" - }, - "application/cea": { - "source": "iana" - }, - "application/cea-2018+xml": { - "source": "iana" - }, - "application/cellml+xml": { - "source": "iana" - }, - "application/cfw": { - "source": "iana" - }, - "application/clue_info+xml": { - "source": "iana" - }, - "application/cms": { - "source": "iana" - }, - "application/cnrp+xml": { - "source": "iana" - }, - "application/coap-group+json": { - "source": "iana", - "compressible": true - }, - "application/coap-payload": { - "source": "iana" - }, - "application/commonground": { - "source": "iana" - }, - "application/conference-info+xml": { - "source": "iana" - }, - "application/cose": { - "source": "iana" - }, - "application/cose-key": { - "source": "iana" - }, - "application/cose-key-set": { - "source": "iana" - }, - "application/cpl+xml": { - "source": "iana" - }, - "application/csrattrs": { - "source": "iana" - }, - "application/csta+xml": { - "source": "iana" - }, - "application/cstadata+xml": { - "source": "iana" - }, - "application/csvm+json": { - "source": "iana", - "compressible": true - }, - "application/cu-seeme": { - "source": "apache", - "extensions": ["cu"] - }, - "application/cybercash": { - "source": "iana" - }, - "application/dart": { - "compressible": true - }, - "application/dash+xml": { - "source": "iana", - "extensions": ["mpd"] - }, - "application/dashdelta": { - "source": "iana" - }, - "application/davmount+xml": { - "source": "iana", - "extensions": ["davmount"] - }, - "application/dca-rft": { - "source": "iana" - }, - "application/dcd": { - "source": "iana" - }, - "application/dec-dx": { - "source": "iana" - }, - "application/dialog-info+xml": { - "source": "iana" - }, - "application/dicom": { - "source": "iana" - }, - "application/dicom+json": { - "source": "iana", - "compressible": true - }, - "application/dicom+xml": { - "source": "iana" - }, - "application/dii": { - "source": "iana" - }, - "application/dit": { - "source": "iana" - }, - "application/dns": { - "source": "iana" - }, - "application/docbook+xml": { - "source": "apache", - "extensions": ["dbk"] - }, - "application/dskpp+xml": { - "source": "iana" - }, - "application/dssc+der": { - "source": "iana", - "extensions": ["dssc"] - }, - "application/dssc+xml": { - "source": "iana", - "extensions": ["xdssc"] - }, - "application/dvcs": { - "source": "iana" - }, - "application/ecmascript": { - "source": "iana", - "compressible": true, - "extensions": ["ecma"] - }, - "application/edi-consent": { - "source": "iana" - }, - "application/edi-x12": { - "source": "iana", - "compressible": false - }, - "application/edifact": { - "source": "iana", - "compressible": false - }, - "application/efi": { - "source": "iana" - }, - "application/emergencycalldata.comment+xml": { - "source": "iana" - }, - "application/emergencycalldata.control+xml": { - "source": "iana" - }, - "application/emergencycalldata.deviceinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.ecall.msd": { - "source": "iana" - }, - "application/emergencycalldata.providerinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.serviceinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.subscriberinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.veds+xml": { - "source": "iana" - }, - "application/emma+xml": { - "source": "iana", - "extensions": ["emma"] - }, - "application/emotionml+xml": { - "source": "iana" - }, - "application/encaprtp": { - "source": "iana" - }, - "application/epp+xml": { - "source": "iana" - }, - "application/epub+zip": { - "source": "iana", - "extensions": ["epub"] - }, - "application/eshop": { - "source": "iana" - }, - "application/exi": { - "source": "iana", - "extensions": ["exi"] - }, - "application/fastinfoset": { - "source": "iana" - }, - "application/fastsoap": { - "source": "iana" - }, - "application/fdt+xml": { - "source": "iana" - }, - "application/fido.trusted-apps+json": { - "compressible": true - }, - "application/fits": { - "source": "iana" - }, - "application/font-sfnt": { - "source": "iana" - }, - "application/font-tdpfr": { - "source": "iana", - "extensions": ["pfr"] - }, - "application/font-woff": { - "source": "iana", - "compressible": false, - "extensions": ["woff"] - }, - "application/font-woff2": { - "compressible": false, - "extensions": ["woff2"] - }, - "application/framework-attributes+xml": { - "source": "iana" - }, - "application/geo+json": { - "source": "iana", - "compressible": true, - "extensions": ["geojson"] - }, - "application/geo+json-seq": { - "source": "iana" - }, - "application/geoxacml+xml": { - "source": "iana" - }, - "application/gml+xml": { - "source": "iana", - "extensions": ["gml"] - }, - "application/gpx+xml": { - "source": "apache", - "extensions": ["gpx"] - }, - "application/gxf": { - "source": "apache", - "extensions": ["gxf"] - }, - "application/gzip": { - "source": "iana", - "compressible": false, - "extensions": ["gz"] - }, - "application/h224": { - "source": "iana" - }, - "application/held+xml": { - "source": "iana" - }, - "application/http": { - "source": "iana" - }, - "application/hyperstudio": { - "source": "iana", - "extensions": ["stk"] - }, - "application/ibe-key-request+xml": { - "source": "iana" - }, - "application/ibe-pkg-reply+xml": { - "source": "iana" - }, - "application/ibe-pp-data": { - "source": "iana" - }, - "application/iges": { - "source": "iana" - }, - "application/im-iscomposing+xml": { - "source": "iana" - }, - "application/index": { - "source": "iana" - }, - "application/index.cmd": { - "source": "iana" - }, - "application/index.obj": { - "source": "iana" - }, - "application/index.response": { - "source": "iana" - }, - "application/index.vnd": { - "source": "iana" - }, - "application/inkml+xml": { - "source": "iana", - "extensions": ["ink","inkml"] - }, - "application/iotp": { - "source": "iana" - }, - "application/ipfix": { - "source": "iana", - "extensions": ["ipfix"] - }, - "application/ipp": { - "source": "iana" - }, - "application/isup": { - "source": "iana" - }, - "application/its+xml": { - "source": "iana" - }, - "application/java-archive": { - "source": "apache", - "compressible": false, - "extensions": ["jar","war","ear"] - }, - "application/java-serialized-object": { - "source": "apache", - "compressible": false, - "extensions": ["ser"] - }, - "application/java-vm": { - "source": "apache", - "compressible": false, - "extensions": ["class"] - }, - "application/javascript": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["js","mjs"] - }, - "application/jf2feed+json": { - "source": "iana", - "compressible": true - }, - "application/jose": { - "source": "iana" - }, - "application/jose+json": { - "source": "iana", - "compressible": true - }, - "application/jrd+json": { - "source": "iana", - "compressible": true - }, - "application/json": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["json","map"] - }, - "application/json-patch+json": { - "source": "iana", - "compressible": true - }, - "application/json-seq": { - "source": "iana" - }, - "application/json5": { - "extensions": ["json5"] - }, - "application/jsonml+json": { - "source": "apache", - "compressible": true, - "extensions": ["jsonml"] - }, - "application/jwk+json": { - "source": "iana", - "compressible": true - }, - "application/jwk-set+json": { - "source": "iana", - "compressible": true - }, - "application/jwt": { - "source": "iana" - }, - "application/kpml-request+xml": { - "source": "iana" - }, - "application/kpml-response+xml": { - "source": "iana" - }, - "application/ld+json": { - "source": "iana", - "compressible": true, - "extensions": ["jsonld"] - }, - "application/lgr+xml": { - "source": "iana" - }, - "application/link-format": { - "source": "iana" - }, - "application/load-control+xml": { - "source": "iana" - }, - "application/lost+xml": { - "source": "iana", - "extensions": ["lostxml"] - }, - "application/lostsync+xml": { - "source": "iana" - }, - "application/lxf": { - "source": "iana" - }, - "application/mac-binhex40": { - "source": "iana", - "extensions": ["hqx"] - }, - "application/mac-compactpro": { - "source": "apache", - "extensions": ["cpt"] - }, - "application/macwriteii": { - "source": "iana" - }, - "application/mads+xml": { - "source": "iana", - "extensions": ["mads"] - }, - "application/manifest+json": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["webmanifest"] - }, - "application/marc": { - "source": "iana", - "extensions": ["mrc"] - }, - "application/marcxml+xml": { - "source": "iana", - "extensions": ["mrcx"] - }, - "application/mathematica": { - "source": "iana", - "extensions": ["ma","nb","mb"] - }, - "application/mathml+xml": { - "source": "iana", - "extensions": ["mathml"] - }, - "application/mathml-content+xml": { - "source": "iana" - }, - "application/mathml-presentation+xml": { - "source": "iana" - }, - "application/mbms-associated-procedure-description+xml": { - "source": "iana" - }, - "application/mbms-deregister+xml": { - "source": "iana" - }, - "application/mbms-envelope+xml": { - "source": "iana" - }, - "application/mbms-msk+xml": { - "source": "iana" - }, - "application/mbms-msk-response+xml": { - "source": "iana" - }, - "application/mbms-protection-description+xml": { - "source": "iana" - }, - "application/mbms-reception-report+xml": { - "source": "iana" - }, - "application/mbms-register+xml": { - "source": "iana" - }, - "application/mbms-register-response+xml": { - "source": "iana" - }, - "application/mbms-schedule+xml": { - "source": "iana" - }, - "application/mbms-user-service-description+xml": { - "source": "iana" - }, - "application/mbox": { - "source": "iana", - "extensions": ["mbox"] - }, - "application/media-policy-dataset+xml": { - "source": "iana" - }, - "application/media_control+xml": { - "source": "iana" - }, - "application/mediaservercontrol+xml": { - "source": "iana", - "extensions": ["mscml"] - }, - "application/merge-patch+json": { - "source": "iana", - "compressible": true - }, - "application/metalink+xml": { - "source": "apache", - "extensions": ["metalink"] - }, - "application/metalink4+xml": { - "source": "iana", - "extensions": ["meta4"] - }, - "application/mets+xml": { - "source": "iana", - "extensions": ["mets"] - }, - "application/mf4": { - "source": "iana" - }, - "application/mikey": { - "source": "iana" - }, - "application/mmt-usd+xml": { - "source": "iana" - }, - "application/mods+xml": { - "source": "iana", - "extensions": ["mods"] - }, - "application/moss-keys": { - "source": "iana" - }, - "application/moss-signature": { - "source": "iana" - }, - "application/mosskey-data": { - "source": "iana" - }, - "application/mosskey-request": { - "source": "iana" - }, - "application/mp21": { - "source": "iana", - "extensions": ["m21","mp21"] - }, - "application/mp4": { - "source": "iana", - "extensions": ["mp4s","m4p"] - }, - "application/mpeg4-generic": { - "source": "iana" - }, - "application/mpeg4-iod": { - "source": "iana" - }, - "application/mpeg4-iod-xmt": { - "source": "iana" - }, - "application/mrb-consumer+xml": { - "source": "iana" - }, - "application/mrb-publish+xml": { - "source": "iana" - }, - "application/msc-ivr+xml": { - "source": "iana" - }, - "application/msc-mixer+xml": { - "source": "iana" - }, - "application/msword": { - "source": "iana", - "compressible": false, - "extensions": ["doc","dot"] - }, - "application/mud+json": { - "source": "iana", - "compressible": true - }, - "application/mxf": { - "source": "iana", - "extensions": ["mxf"] - }, - "application/n-quads": { - "source": "iana" - }, - "application/n-triples": { - "source": "iana" - }, - "application/nasdata": { - "source": "iana" - }, - "application/news-checkgroups": { - "source": "iana" - }, - "application/news-groupinfo": { - "source": "iana" - }, - "application/news-transmission": { - "source": "iana" - }, - "application/nlsml+xml": { - "source": "iana" - }, - "application/nss": { - "source": "iana" - }, - "application/ocsp-request": { - "source": "iana" - }, - "application/ocsp-response": { - "source": "iana" - }, - "application/octet-stream": { - "source": "iana", - "compressible": false, - "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] - }, - "application/oda": { - "source": "iana", - "extensions": ["oda"] - }, - "application/odx": { - "source": "iana" - }, - "application/oebps-package+xml": { - "source": "iana", - "extensions": ["opf"] - }, - "application/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogx"] - }, - "application/omdoc+xml": { - "source": "apache", - "extensions": ["omdoc"] - }, - "application/onenote": { - "source": "apache", - "extensions": ["onetoc","onetoc2","onetmp","onepkg"] - }, - "application/oxps": { - "source": "iana", - "extensions": ["oxps"] - }, - "application/p2p-overlay+xml": { - "source": "iana" - }, - "application/parityfec": { - "source": "iana" - }, - "application/passport": { - "source": "iana" - }, - "application/patch-ops-error+xml": { - "source": "iana", - "extensions": ["xer"] - }, - "application/pdf": { - "source": "iana", - "compressible": false, - "extensions": ["pdf"] - }, - "application/pdx": { - "source": "iana" - }, - "application/pgp-encrypted": { - "source": "iana", - "compressible": false, - "extensions": ["pgp"] - }, - "application/pgp-keys": { - "source": "iana" - }, - "application/pgp-signature": { - "source": "iana", - "extensions": ["asc","sig"] - }, - "application/pics-rules": { - "source": "apache", - "extensions": ["prf"] - }, - "application/pidf+xml": { - "source": "iana" - }, - "application/pidf-diff+xml": { - "source": "iana" - }, - "application/pkcs10": { - "source": "iana", - "extensions": ["p10"] - }, - "application/pkcs12": { - "source": "iana" - }, - "application/pkcs7-mime": { - "source": "iana", - "extensions": ["p7m","p7c"] - }, - "application/pkcs7-signature": { - "source": "iana", - "extensions": ["p7s"] - }, - "application/pkcs8": { - "source": "iana", - "extensions": ["p8"] - }, - "application/pkix-attr-cert": { - "source": "iana", - "extensions": ["ac"] - }, - "application/pkix-cert": { - "source": "iana", - "extensions": ["cer"] - }, - "application/pkix-crl": { - "source": "iana", - "extensions": ["crl"] - }, - "application/pkix-pkipath": { - "source": "iana", - "extensions": ["pkipath"] - }, - "application/pkixcmp": { - "source": "iana", - "extensions": ["pki"] - }, - "application/pls+xml": { - "source": "iana", - "extensions": ["pls"] - }, - "application/poc-settings+xml": { - "source": "iana" - }, - "application/postscript": { - "source": "iana", - "compressible": true, - "extensions": ["ai","eps","ps"] - }, - "application/ppsp-tracker+json": { - "source": "iana", - "compressible": true - }, - "application/problem+json": { - "source": "iana", - "compressible": true - }, - "application/problem+xml": { - "source": "iana" - }, - "application/provenance+xml": { - "source": "iana" - }, - "application/prs.alvestrand.titrax-sheet": { - "source": "iana" - }, - "application/prs.cww": { - "source": "iana", - "extensions": ["cww"] - }, - "application/prs.hpub+zip": { - "source": "iana" - }, - "application/prs.nprend": { - "source": "iana" - }, - "application/prs.plucker": { - "source": "iana" - }, - "application/prs.rdf-xml-crypt": { - "source": "iana" - }, - "application/prs.xsf+xml": { - "source": "iana" - }, - "application/pskc+xml": { - "source": "iana", - "extensions": ["pskcxml"] - }, - "application/qsig": { - "source": "iana" - }, - "application/raptorfec": { - "source": "iana" - }, - "application/rdap+json": { - "source": "iana", - "compressible": true - }, - "application/rdf+xml": { - "source": "iana", - "compressible": true, - "extensions": ["rdf"] - }, - "application/reginfo+xml": { - "source": "iana", - "extensions": ["rif"] - }, - "application/relax-ng-compact-syntax": { - "source": "iana", - "extensions": ["rnc"] - }, - "application/remote-printing": { - "source": "iana" - }, - "application/reputon+json": { - "source": "iana", - "compressible": true - }, - "application/resource-lists+xml": { - "source": "iana", - "extensions": ["rl"] - }, - "application/resource-lists-diff+xml": { - "source": "iana", - "extensions": ["rld"] - }, - "application/rfc+xml": { - "source": "iana" - }, - "application/riscos": { - "source": "iana" - }, - "application/rlmi+xml": { - "source": "iana" - }, - "application/rls-services+xml": { - "source": "iana", - "extensions": ["rs"] - }, - "application/route-apd+xml": { - "source": "iana" - }, - "application/route-s-tsid+xml": { - "source": "iana" - }, - "application/route-usd+xml": { - "source": "iana" - }, - "application/rpki-ghostbusters": { - "source": "iana", - "extensions": ["gbr"] - }, - "application/rpki-manifest": { - "source": "iana", - "extensions": ["mft"] - }, - "application/rpki-publication": { - "source": "iana" - }, - "application/rpki-roa": { - "source": "iana", - "extensions": ["roa"] - }, - "application/rpki-updown": { - "source": "iana" - }, - "application/rsd+xml": { - "source": "apache", - "extensions": ["rsd"] - }, - "application/rss+xml": { - "source": "apache", - "compressible": true, - "extensions": ["rss"] - }, - "application/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "application/rtploopback": { - "source": "iana" - }, - "application/rtx": { - "source": "iana" - }, - "application/samlassertion+xml": { - "source": "iana" - }, - "application/samlmetadata+xml": { - "source": "iana" - }, - "application/sbml+xml": { - "source": "iana", - "extensions": ["sbml"] - }, - "application/scaip+xml": { - "source": "iana" - }, - "application/scim+json": { - "source": "iana", - "compressible": true - }, - "application/scvp-cv-request": { - "source": "iana", - "extensions": ["scq"] - }, - "application/scvp-cv-response": { - "source": "iana", - "extensions": ["scs"] - }, - "application/scvp-vp-request": { - "source": "iana", - "extensions": ["spq"] - }, - "application/scvp-vp-response": { - "source": "iana", - "extensions": ["spp"] - }, - "application/sdp": { - "source": "iana", - "extensions": ["sdp"] - }, - "application/sep+xml": { - "source": "iana" - }, - "application/sep-exi": { - "source": "iana" - }, - "application/session-info": { - "source": "iana" - }, - "application/set-payment": { - "source": "iana" - }, - "application/set-payment-initiation": { - "source": "iana", - "extensions": ["setpay"] - }, - "application/set-registration": { - "source": "iana" - }, - "application/set-registration-initiation": { - "source": "iana", - "extensions": ["setreg"] - }, - "application/sgml": { - "source": "iana" - }, - "application/sgml-open-catalog": { - "source": "iana" - }, - "application/shf+xml": { - "source": "iana", - "extensions": ["shf"] - }, - "application/sieve": { - "source": "iana" - }, - "application/simple-filter+xml": { - "source": "iana" - }, - "application/simple-message-summary": { - "source": "iana" - }, - "application/simplesymbolcontainer": { - "source": "iana" - }, - "application/slate": { - "source": "iana" - }, - "application/smil": { - "source": "iana" - }, - "application/smil+xml": { - "source": "iana", - "extensions": ["smi","smil"] - }, - "application/smpte336m": { - "source": "iana" - }, - "application/soap+fastinfoset": { - "source": "iana" - }, - "application/soap+xml": { - "source": "iana", - "compressible": true - }, - "application/sparql-query": { - "source": "iana", - "extensions": ["rq"] - }, - "application/sparql-results+xml": { - "source": "iana", - "extensions": ["srx"] - }, - "application/spirits-event+xml": { - "source": "iana" - }, - "application/sql": { - "source": "iana" - }, - "application/srgs": { - "source": "iana", - "extensions": ["gram"] - }, - "application/srgs+xml": { - "source": "iana", - "extensions": ["grxml"] - }, - "application/sru+xml": { - "source": "iana", - "extensions": ["sru"] - }, - "application/ssdl+xml": { - "source": "apache", - "extensions": ["ssdl"] - }, - "application/ssml+xml": { - "source": "iana", - "extensions": ["ssml"] - }, - "application/tamp-apex-update": { - "source": "iana" - }, - "application/tamp-apex-update-confirm": { - "source": "iana" - }, - "application/tamp-community-update": { - "source": "iana" - }, - "application/tamp-community-update-confirm": { - "source": "iana" - }, - "application/tamp-error": { - "source": "iana" - }, - "application/tamp-sequence-adjust": { - "source": "iana" - }, - "application/tamp-sequence-adjust-confirm": { - "source": "iana" - }, - "application/tamp-status-query": { - "source": "iana" - }, - "application/tamp-status-response": { - "source": "iana" - }, - "application/tamp-update": { - "source": "iana" - }, - "application/tamp-update-confirm": { - "source": "iana" - }, - "application/tar": { - "compressible": true - }, - "application/tei+xml": { - "source": "iana", - "extensions": ["tei","teicorpus"] - }, - "application/thraud+xml": { - "source": "iana", - "extensions": ["tfi"] - }, - "application/timestamp-query": { - "source": "iana" - }, - "application/timestamp-reply": { - "source": "iana" - }, - "application/timestamped-data": { - "source": "iana", - "extensions": ["tsd"] - }, - "application/trig": { - "source": "iana" - }, - "application/ttml+xml": { - "source": "iana" - }, - "application/tve-trigger": { - "source": "iana" - }, - "application/ulpfec": { - "source": "iana" - }, - "application/urc-grpsheet+xml": { - "source": "iana" - }, - "application/urc-ressheet+xml": { - "source": "iana" - }, - "application/urc-targetdesc+xml": { - "source": "iana" - }, - "application/urc-uisocketdesc+xml": { - "source": "iana" - }, - "application/vcard+json": { - "source": "iana", - "compressible": true - }, - "application/vcard+xml": { - "source": "iana" - }, - "application/vemmi": { - "source": "iana" - }, - "application/vividence.scriptfile": { - "source": "apache" - }, - "application/vnd.1000minds.decision-model+xml": { - "source": "iana" - }, - "application/vnd.3gpp-prose+xml": { - "source": "iana" - }, - "application/vnd.3gpp-prose-pc3ch+xml": { - "source": "iana" - }, - "application/vnd.3gpp.access-transfer-events+xml": { - "source": "iana" - }, - "application/vnd.3gpp.bsf+xml": { - "source": "iana" - }, - "application/vnd.3gpp.gmop+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-mbms-usage-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mid-call+xml": { - "source": "iana" - }, - "application/vnd.3gpp.pic-bw-large": { - "source": "iana", - "extensions": ["plb"] - }, - "application/vnd.3gpp.pic-bw-small": { - "source": "iana", - "extensions": ["psb"] - }, - "application/vnd.3gpp.pic-bw-var": { - "source": "iana", - "extensions": ["pvb"] - }, - "application/vnd.3gpp.sms": { - "source": "iana" - }, - "application/vnd.3gpp.sms+xml": { - "source": "iana" - }, - "application/vnd.3gpp.srvcc-ext+xml": { - "source": "iana" - }, - "application/vnd.3gpp.srvcc-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.state-and-event-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.ussd+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.bcmcsinfo+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.sms": { - "source": "iana" - }, - "application/vnd.3gpp2.tcap": { - "source": "iana", - "extensions": ["tcap"] - }, - "application/vnd.3lightssoftware.imagescal": { - "source": "iana" - }, - "application/vnd.3m.post-it-notes": { - "source": "iana", - "extensions": ["pwn"] - }, - "application/vnd.accpac.simply.aso": { - "source": "iana", - "extensions": ["aso"] - }, - "application/vnd.accpac.simply.imp": { - "source": "iana", - "extensions": ["imp"] - }, - "application/vnd.acucobol": { - "source": "iana", - "extensions": ["acu"] - }, - "application/vnd.acucorp": { - "source": "iana", - "extensions": ["atc","acutc"] - }, - "application/vnd.adobe.air-application-installer-package+zip": { - "source": "apache", - "extensions": ["air"] - }, - "application/vnd.adobe.flash.movie": { - "source": "iana" - }, - "application/vnd.adobe.formscentral.fcdt": { - "source": "iana", - "extensions": ["fcdt"] - }, - "application/vnd.adobe.fxp": { - "source": "iana", - "extensions": ["fxp","fxpl"] - }, - "application/vnd.adobe.partial-upload": { - "source": "iana" - }, - "application/vnd.adobe.xdp+xml": { - "source": "iana", - "extensions": ["xdp"] - }, - "application/vnd.adobe.xfdf": { - "source": "iana", - "extensions": ["xfdf"] - }, - "application/vnd.aether.imp": { - "source": "iana" - }, - "application/vnd.ah-barcode": { - "source": "iana" - }, - "application/vnd.ahead.space": { - "source": "iana", - "extensions": ["ahead"] - }, - "application/vnd.airzip.filesecure.azf": { - "source": "iana", - "extensions": ["azf"] - }, - "application/vnd.airzip.filesecure.azs": { - "source": "iana", - "extensions": ["azs"] - }, - "application/vnd.amazon.ebook": { - "source": "apache", - "extensions": ["azw"] - }, - "application/vnd.amazon.mobi8-ebook": { - "source": "iana" - }, - "application/vnd.americandynamics.acc": { - "source": "iana", - "extensions": ["acc"] - }, - "application/vnd.amiga.ami": { - "source": "iana", - "extensions": ["ami"] - }, - "application/vnd.amundsen.maze+xml": { - "source": "iana" - }, - "application/vnd.android.package-archive": { - "source": "apache", - "compressible": false, - "extensions": ["apk"] - }, - "application/vnd.anki": { - "source": "iana" - }, - "application/vnd.anser-web-certificate-issue-initiation": { - "source": "iana", - "extensions": ["cii"] - }, - "application/vnd.anser-web-funds-transfer-initiation": { - "source": "apache", - "extensions": ["fti"] - }, - "application/vnd.antix.game-component": { - "source": "iana", - "extensions": ["atx"] - }, - "application/vnd.apache.thrift.binary": { - "source": "iana" - }, - "application/vnd.apache.thrift.compact": { - "source": "iana" - }, - "application/vnd.apache.thrift.json": { - "source": "iana" - }, - "application/vnd.api+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apothekende.reservation+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apple.installer+xml": { - "source": "iana", - "extensions": ["mpkg"] - }, - "application/vnd.apple.mpegurl": { - "source": "iana", - "extensions": ["m3u8"] - }, - "application/vnd.apple.pkpass": { - "compressible": false, - "extensions": ["pkpass"] - }, - "application/vnd.arastra.swi": { - "source": "iana" - }, - "application/vnd.aristanetworks.swi": { - "source": "iana", - "extensions": ["swi"] - }, - "application/vnd.artsquare": { - "source": "iana" - }, - "application/vnd.astraea-software.iota": { - "source": "iana", - "extensions": ["iota"] - }, - "application/vnd.audiograph": { - "source": "iana", - "extensions": ["aep"] - }, - "application/vnd.autopackage": { - "source": "iana" - }, - "application/vnd.avistar+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmml+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmpr": { - "source": "iana" - }, - "application/vnd.bekitzur-stech+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.bint.med-content": { - "source": "iana" - }, - "application/vnd.biopax.rdf+xml": { - "source": "iana" - }, - "application/vnd.blink-idb-value-wrapper": { - "source": "iana" - }, - "application/vnd.blueice.multipass": { - "source": "iana", - "extensions": ["mpm"] - }, - "application/vnd.bluetooth.ep.oob": { - "source": "iana" - }, - "application/vnd.bluetooth.le.oob": { - "source": "iana" - }, - "application/vnd.bmi": { - "source": "iana", - "extensions": ["bmi"] - }, - "application/vnd.businessobjects": { - "source": "iana", - "extensions": ["rep"] - }, - "application/vnd.cab-jscript": { - "source": "iana" - }, - "application/vnd.canon-cpdl": { - "source": "iana" - }, - "application/vnd.canon-lips": { - "source": "iana" - }, - "application/vnd.capasystems-pg+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.cendio.thinlinc.clientconf": { - "source": "iana" - }, - "application/vnd.century-systems.tcp_stream": { - "source": "iana" - }, - "application/vnd.chemdraw+xml": { - "source": "iana", - "extensions": ["cdxml"] - }, - "application/vnd.chess-pgn": { - "source": "iana" - }, - "application/vnd.chipnuts.karaoke-mmd": { - "source": "iana", - "extensions": ["mmd"] - }, - "application/vnd.cinderella": { - "source": "iana", - "extensions": ["cdy"] - }, - "application/vnd.cirpack.isdn-ext": { - "source": "iana" - }, - "application/vnd.citationstyles.style+xml": { - "source": "iana" - }, - "application/vnd.claymore": { - "source": "iana", - "extensions": ["cla"] - }, - "application/vnd.cloanto.rp9": { - "source": "iana", - "extensions": ["rp9"] - }, - "application/vnd.clonk.c4group": { - "source": "iana", - "extensions": ["c4g","c4d","c4f","c4p","c4u"] - }, - "application/vnd.cluetrust.cartomobile-config": { - "source": "iana", - "extensions": ["c11amc"] - }, - "application/vnd.cluetrust.cartomobile-config-pkg": { - "source": "iana", - "extensions": ["c11amz"] - }, - "application/vnd.coffeescript": { - "source": "iana" - }, - "application/vnd.collection+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.doc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.next+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.comicbook+zip": { - "source": "iana" - }, - "application/vnd.commerce-battelle": { - "source": "iana" - }, - "application/vnd.commonspace": { - "source": "iana", - "extensions": ["csp"] - }, - "application/vnd.contact.cmsg": { - "source": "iana", - "extensions": ["cdbcmsg"] - }, - "application/vnd.coreos.ignition+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.cosmocaller": { - "source": "iana", - "extensions": ["cmc"] - }, - "application/vnd.crick.clicker": { - "source": "iana", - "extensions": ["clkx"] - }, - "application/vnd.crick.clicker.keyboard": { - "source": "iana", - "extensions": ["clkk"] - }, - "application/vnd.crick.clicker.palette": { - "source": "iana", - "extensions": ["clkp"] - }, - "application/vnd.crick.clicker.template": { - "source": "iana", - "extensions": ["clkt"] - }, - "application/vnd.crick.clicker.wordbank": { - "source": "iana", - "extensions": ["clkw"] - }, - "application/vnd.criticaltools.wbs+xml": { - "source": "iana", - "extensions": ["wbs"] - }, - "application/vnd.ctc-posml": { - "source": "iana", - "extensions": ["pml"] - }, - "application/vnd.ctct.ws+xml": { - "source": "iana" - }, - "application/vnd.cups-pdf": { - "source": "iana" - }, - "application/vnd.cups-postscript": { - "source": "iana" - }, - "application/vnd.cups-ppd": { - "source": "iana", - "extensions": ["ppd"] - }, - "application/vnd.cups-raster": { - "source": "iana" - }, - "application/vnd.cups-raw": { - "source": "iana" - }, - "application/vnd.curl": { - "source": "iana" - }, - "application/vnd.curl.car": { - "source": "apache", - "extensions": ["car"] - }, - "application/vnd.curl.pcurl": { - "source": "apache", - "extensions": ["pcurl"] - }, - "application/vnd.cyan.dean.root+xml": { - "source": "iana" - }, - "application/vnd.cybank": { - "source": "iana" - }, - "application/vnd.d2l.coursepackage1p0+zip": { - "source": "iana" - }, - "application/vnd.dart": { - "source": "iana", - "compressible": true, - "extensions": ["dart"] - }, - "application/vnd.data-vision.rdz": { - "source": "iana", - "extensions": ["rdz"] - }, - "application/vnd.datapackage+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dataresource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.debian.binary-package": { - "source": "iana" - }, - "application/vnd.dece.data": { - "source": "iana", - "extensions": ["uvf","uvvf","uvd","uvvd"] - }, - "application/vnd.dece.ttml+xml": { - "source": "iana", - "extensions": ["uvt","uvvt"] - }, - "application/vnd.dece.unspecified": { - "source": "iana", - "extensions": ["uvx","uvvx"] - }, - "application/vnd.dece.zip": { - "source": "iana", - "extensions": ["uvz","uvvz"] - }, - "application/vnd.denovo.fcselayout-link": { - "source": "iana", - "extensions": ["fe_launch"] - }, - "application/vnd.desmume-movie": { - "source": "iana" - }, - "application/vnd.desmume.movie": { - "source": "apache" - }, - "application/vnd.dir-bi.plate-dl-nosuffix": { - "source": "iana" - }, - "application/vnd.dm.delegation+xml": { - "source": "iana" - }, - "application/vnd.dna": { - "source": "iana", - "extensions": ["dna"] - }, - "application/vnd.document+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dolby.mlp": { - "source": "apache", - "extensions": ["mlp"] - }, - "application/vnd.dolby.mobile.1": { - "source": "iana" - }, - "application/vnd.dolby.mobile.2": { - "source": "iana" - }, - "application/vnd.doremir.scorecloud-binary-document": { - "source": "iana" - }, - "application/vnd.dpgraph": { - "source": "iana", - "extensions": ["dpg"] - }, - "application/vnd.dreamfactory": { - "source": "iana", - "extensions": ["dfac"] - }, - "application/vnd.drive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ds-keypoint": { - "source": "apache", - "extensions": ["kpxx"] - }, - "application/vnd.dtg.local": { - "source": "iana" - }, - "application/vnd.dtg.local.flash": { - "source": "iana" - }, - "application/vnd.dtg.local.html": { - "source": "iana" - }, - "application/vnd.dvb.ait": { - "source": "iana", - "extensions": ["ait"] - }, - "application/vnd.dvb.dvbj": { - "source": "iana" - }, - "application/vnd.dvb.esgcontainer": { - "source": "iana" - }, - "application/vnd.dvb.ipdcdftnotifaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess2": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgpdd": { - "source": "iana" - }, - "application/vnd.dvb.ipdcroaming": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-base": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-enhancement": { - "source": "iana" - }, - "application/vnd.dvb.notif-aggregate-root+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-container+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-generic+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-msglist+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-request+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-response+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-init+xml": { - "source": "iana" - }, - "application/vnd.dvb.pfr": { - "source": "iana" - }, - "application/vnd.dvb.service": { - "source": "iana", - "extensions": ["svc"] - }, - "application/vnd.dxr": { - "source": "iana" - }, - "application/vnd.dynageo": { - "source": "iana", - "extensions": ["geo"] - }, - "application/vnd.dzr": { - "source": "iana" - }, - "application/vnd.easykaraoke.cdgdownload": { - "source": "iana" - }, - "application/vnd.ecdis-update": { - "source": "iana" - }, - "application/vnd.ecowin.chart": { - "source": "iana", - "extensions": ["mag"] - }, - "application/vnd.ecowin.filerequest": { - "source": "iana" - }, - "application/vnd.ecowin.fileupdate": { - "source": "iana" - }, - "application/vnd.ecowin.series": { - "source": "iana" - }, - "application/vnd.ecowin.seriesrequest": { - "source": "iana" - }, - "application/vnd.ecowin.seriesupdate": { - "source": "iana" - }, - "application/vnd.efi.img": { - "source": "iana" - }, - "application/vnd.efi.iso": { - "source": "iana" - }, - "application/vnd.emclient.accessrequest+xml": { - "source": "iana" - }, - "application/vnd.enliven": { - "source": "iana", - "extensions": ["nml"] - }, - "application/vnd.enphase.envoy": { - "source": "iana" - }, - "application/vnd.eprints.data+xml": { - "source": "iana" - }, - "application/vnd.epson.esf": { - "source": "iana", - "extensions": ["esf"] - }, - "application/vnd.epson.msf": { - "source": "iana", - "extensions": ["msf"] - }, - "application/vnd.epson.quickanime": { - "source": "iana", - "extensions": ["qam"] - }, - "application/vnd.epson.salt": { - "source": "iana", - "extensions": ["slt"] - }, - "application/vnd.epson.ssf": { - "source": "iana", - "extensions": ["ssf"] - }, - "application/vnd.ericsson.quickcall": { - "source": "iana" - }, - "application/vnd.espass-espass+zip": { - "source": "iana" - }, - "application/vnd.eszigno3+xml": { - "source": "iana", - "extensions": ["es3","et3"] - }, - "application/vnd.etsi.aoc+xml": { - "source": "iana" - }, - "application/vnd.etsi.asic-e+zip": { - "source": "iana" - }, - "application/vnd.etsi.asic-s+zip": { - "source": "iana" - }, - "application/vnd.etsi.cug+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvcommand+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvdiscovery+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-bc+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-cod+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-npvr+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvservice+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsync+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvueprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.mcid+xml": { - "source": "iana" - }, - "application/vnd.etsi.mheg5": { - "source": "iana" - }, - "application/vnd.etsi.overload-control-policy-dataset+xml": { - "source": "iana" - }, - "application/vnd.etsi.pstn+xml": { - "source": "iana" - }, - "application/vnd.etsi.sci+xml": { - "source": "iana" - }, - "application/vnd.etsi.simservs+xml": { - "source": "iana" - }, - "application/vnd.etsi.timestamp-token": { - "source": "iana" - }, - "application/vnd.etsi.tsl+xml": { - "source": "iana" - }, - "application/vnd.etsi.tsl.der": { - "source": "iana" - }, - "application/vnd.eudora.data": { - "source": "iana" - }, - "application/vnd.evolv.ecig.profile": { - "source": "iana" - }, - "application/vnd.evolv.ecig.settings": { - "source": "iana" - }, - "application/vnd.evolv.ecig.theme": { - "source": "iana" - }, - "application/vnd.ezpix-album": { - "source": "iana", - "extensions": ["ez2"] - }, - "application/vnd.ezpix-package": { - "source": "iana", - "extensions": ["ez3"] - }, - "application/vnd.f-secure.mobile": { - "source": "iana" - }, - "application/vnd.fastcopy-disk-image": { - "source": "iana" - }, - "application/vnd.fdf": { - "source": "iana", - "extensions": ["fdf"] - }, - "application/vnd.fdsn.mseed": { - "source": "iana", - "extensions": ["mseed"] - }, - "application/vnd.fdsn.seed": { - "source": "iana", - "extensions": ["seed","dataless"] - }, - "application/vnd.ffsns": { - "source": "iana" - }, - "application/vnd.filmit.zfc": { - "source": "iana" - }, - "application/vnd.fints": { - "source": "iana" - }, - "application/vnd.firemonkeys.cloudcell": { - "source": "iana" - }, - "application/vnd.flographit": { - "source": "iana", - "extensions": ["gph"] - }, - "application/vnd.fluxtime.clip": { - "source": "iana", - "extensions": ["ftc"] - }, - "application/vnd.font-fontforge-sfd": { - "source": "iana" - }, - "application/vnd.framemaker": { - "source": "iana", - "extensions": ["fm","frame","maker","book"] - }, - "application/vnd.frogans.fnc": { - "source": "iana", - "extensions": ["fnc"] - }, - "application/vnd.frogans.ltf": { - "source": "iana", - "extensions": ["ltf"] - }, - "application/vnd.fsc.weblaunch": { - "source": "iana", - "extensions": ["fsc"] - }, - "application/vnd.fujitsu.oasys": { - "source": "iana", - "extensions": ["oas"] - }, - "application/vnd.fujitsu.oasys2": { - "source": "iana", - "extensions": ["oa2"] - }, - "application/vnd.fujitsu.oasys3": { - "source": "iana", - "extensions": ["oa3"] - }, - "application/vnd.fujitsu.oasysgp": { - "source": "iana", - "extensions": ["fg5"] - }, - "application/vnd.fujitsu.oasysprs": { - "source": "iana", - "extensions": ["bh2"] - }, - "application/vnd.fujixerox.art-ex": { - "source": "iana" - }, - "application/vnd.fujixerox.art4": { - "source": "iana" - }, - "application/vnd.fujixerox.ddd": { - "source": "iana", - "extensions": ["ddd"] - }, - "application/vnd.fujixerox.docuworks": { - "source": "iana", - "extensions": ["xdw"] - }, - "application/vnd.fujixerox.docuworks.binder": { - "source": "iana", - "extensions": ["xbd"] - }, - "application/vnd.fujixerox.docuworks.container": { - "source": "iana" - }, - "application/vnd.fujixerox.hbpl": { - "source": "iana" - }, - "application/vnd.fut-misnet": { - "source": "iana" - }, - "application/vnd.fuzzysheet": { - "source": "iana", - "extensions": ["fzs"] - }, - "application/vnd.genomatix.tuxedo": { - "source": "iana", - "extensions": ["txd"] - }, - "application/vnd.geo+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.geocube+xml": { - "source": "iana" - }, - "application/vnd.geogebra.file": { - "source": "iana", - "extensions": ["ggb"] - }, - "application/vnd.geogebra.tool": { - "source": "iana", - "extensions": ["ggt"] - }, - "application/vnd.geometry-explorer": { - "source": "iana", - "extensions": ["gex","gre"] - }, - "application/vnd.geonext": { - "source": "iana", - "extensions": ["gxt"] - }, - "application/vnd.geoplan": { - "source": "iana", - "extensions": ["g2w"] - }, - "application/vnd.geospace": { - "source": "iana", - "extensions": ["g3w"] - }, - "application/vnd.gerber": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt-response": { - "source": "iana" - }, - "application/vnd.gmx": { - "source": "iana", - "extensions": ["gmx"] - }, - "application/vnd.google-apps.document": { - "compressible": false, - "extensions": ["gdoc"] - }, - "application/vnd.google-apps.presentation": { - "compressible": false, - "extensions": ["gslides"] - }, - "application/vnd.google-apps.spreadsheet": { - "compressible": false, - "extensions": ["gsheet"] - }, - "application/vnd.google-earth.kml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["kml"] - }, - "application/vnd.google-earth.kmz": { - "source": "iana", - "compressible": false, - "extensions": ["kmz"] - }, - "application/vnd.gov.sk.e-form+xml": { - "source": "iana" - }, - "application/vnd.gov.sk.e-form+zip": { - "source": "iana" - }, - "application/vnd.gov.sk.xmldatacontainer+xml": { - "source": "iana" - }, - "application/vnd.grafeq": { - "source": "iana", - "extensions": ["gqf","gqs"] - }, - "application/vnd.gridmp": { - "source": "iana" - }, - "application/vnd.groove-account": { - "source": "iana", - "extensions": ["gac"] - }, - "application/vnd.groove-help": { - "source": "iana", - "extensions": ["ghf"] - }, - "application/vnd.groove-identity-message": { - "source": "iana", - "extensions": ["gim"] - }, - "application/vnd.groove-injector": { - "source": "iana", - "extensions": ["grv"] - }, - "application/vnd.groove-tool-message": { - "source": "iana", - "extensions": ["gtm"] - }, - "application/vnd.groove-tool-template": { - "source": "iana", - "extensions": ["tpl"] - }, - "application/vnd.groove-vcard": { - "source": "iana", - "extensions": ["vcg"] - }, - "application/vnd.hal+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hal+xml": { - "source": "iana", - "extensions": ["hal"] - }, - "application/vnd.handheld-entertainment+xml": { - "source": "iana", - "extensions": ["zmm"] - }, - "application/vnd.hbci": { - "source": "iana", - "extensions": ["hbci"] - }, - "application/vnd.hc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hcl-bireports": { - "source": "iana" - }, - "application/vnd.hdt": { - "source": "iana" - }, - "application/vnd.heroku+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hhe.lesson-player": { - "source": "iana", - "extensions": ["les"] - }, - "application/vnd.hp-hpgl": { - "source": "iana", - "extensions": ["hpgl"] - }, - "application/vnd.hp-hpid": { - "source": "iana", - "extensions": ["hpid"] - }, - "application/vnd.hp-hps": { - "source": "iana", - "extensions": ["hps"] - }, - "application/vnd.hp-jlyt": { - "source": "iana", - "extensions": ["jlt"] - }, - "application/vnd.hp-pcl": { - "source": "iana", - "extensions": ["pcl"] - }, - "application/vnd.hp-pclxl": { - "source": "iana", - "extensions": ["pclxl"] - }, - "application/vnd.httphone": { - "source": "iana" - }, - "application/vnd.hydrostatix.sof-data": { - "source": "iana", - "extensions": ["sfd-hdstx"] - }, - "application/vnd.hyper-item+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hyperdrive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hzn-3d-crossword": { - "source": "iana" - }, - "application/vnd.ibm.afplinedata": { - "source": "iana" - }, - "application/vnd.ibm.electronic-media": { - "source": "iana" - }, - "application/vnd.ibm.minipay": { - "source": "iana", - "extensions": ["mpy"] - }, - "application/vnd.ibm.modcap": { - "source": "iana", - "extensions": ["afp","listafp","list3820"] - }, - "application/vnd.ibm.rights-management": { - "source": "iana", - "extensions": ["irm"] - }, - "application/vnd.ibm.secure-container": { - "source": "iana", - "extensions": ["sc"] - }, - "application/vnd.iccprofile": { - "source": "iana", - "extensions": ["icc","icm"] - }, - "application/vnd.ieee.1905": { - "source": "iana" - }, - "application/vnd.igloader": { - "source": "iana", - "extensions": ["igl"] - }, - "application/vnd.imagemeter.folder+zip": { - "source": "iana" - }, - "application/vnd.imagemeter.image+zip": { - "source": "iana" - }, - "application/vnd.immervision-ivp": { - "source": "iana", - "extensions": ["ivp"] - }, - "application/vnd.immervision-ivu": { - "source": "iana", - "extensions": ["ivu"] - }, - "application/vnd.ims.imsccv1p1": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p2": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p3": { - "source": "iana" - }, - "application/vnd.ims.lis.v2.result+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolconsumerprofile+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy.id+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings.simple+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.informedcontrol.rms+xml": { - "source": "iana" - }, - "application/vnd.informix-visionary": { - "source": "iana" - }, - "application/vnd.infotech.project": { - "source": "iana" - }, - "application/vnd.infotech.project+xml": { - "source": "iana" - }, - "application/vnd.innopath.wamp.notification": { - "source": "iana" - }, - "application/vnd.insors.igm": { - "source": "iana", - "extensions": ["igm"] - }, - "application/vnd.intercon.formnet": { - "source": "iana", - "extensions": ["xpw","xpx"] - }, - "application/vnd.intergeo": { - "source": "iana", - "extensions": ["i2g"] - }, - "application/vnd.intertrust.digibox": { - "source": "iana" - }, - "application/vnd.intertrust.nncp": { - "source": "iana" - }, - "application/vnd.intu.qbo": { - "source": "iana", - "extensions": ["qbo"] - }, - "application/vnd.intu.qfx": { - "source": "iana", - "extensions": ["qfx"] - }, - "application/vnd.iptc.g2.catalogitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.conceptitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.knowledgeitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsmessage+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.packageitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.planningitem+xml": { - "source": "iana" - }, - "application/vnd.ipunplugged.rcprofile": { - "source": "iana", - "extensions": ["rcprofile"] - }, - "application/vnd.irepository.package+xml": { - "source": "iana", - "extensions": ["irp"] - }, - "application/vnd.is-xpr": { - "source": "iana", - "extensions": ["xpr"] - }, - "application/vnd.isac.fcs": { - "source": "iana", - "extensions": ["fcs"] - }, - "application/vnd.jam": { - "source": "iana", - "extensions": ["jam"] - }, - "application/vnd.japannet-directory-service": { - "source": "iana" - }, - "application/vnd.japannet-jpnstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-payment-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-registration": { - "source": "iana" - }, - "application/vnd.japannet-registration-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-setstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-verification": { - "source": "iana" - }, - "application/vnd.japannet-verification-wakeup": { - "source": "iana" - }, - "application/vnd.jcp.javame.midlet-rms": { - "source": "iana", - "extensions": ["rms"] - }, - "application/vnd.jisp": { - "source": "iana", - "extensions": ["jisp"] - }, - "application/vnd.joost.joda-archive": { - "source": "iana", - "extensions": ["joda"] - }, - "application/vnd.jsk.isdn-ngn": { - "source": "iana" - }, - "application/vnd.kahootz": { - "source": "iana", - "extensions": ["ktz","ktr"] - }, - "application/vnd.kde.karbon": { - "source": "iana", - "extensions": ["karbon"] - }, - "application/vnd.kde.kchart": { - "source": "iana", - "extensions": ["chrt"] - }, - "application/vnd.kde.kformula": { - "source": "iana", - "extensions": ["kfo"] - }, - "application/vnd.kde.kivio": { - "source": "iana", - "extensions": ["flw"] - }, - "application/vnd.kde.kontour": { - "source": "iana", - "extensions": ["kon"] - }, - "application/vnd.kde.kpresenter": { - "source": "iana", - "extensions": ["kpr","kpt"] - }, - "application/vnd.kde.kspread": { - "source": "iana", - "extensions": ["ksp"] - }, - "application/vnd.kde.kword": { - "source": "iana", - "extensions": ["kwd","kwt"] - }, - "application/vnd.kenameaapp": { - "source": "iana", - "extensions": ["htke"] - }, - "application/vnd.kidspiration": { - "source": "iana", - "extensions": ["kia"] - }, - "application/vnd.kinar": { - "source": "iana", - "extensions": ["kne","knp"] - }, - "application/vnd.koan": { - "source": "iana", - "extensions": ["skp","skd","skt","skm"] - }, - "application/vnd.kodak-descriptor": { - "source": "iana", - "extensions": ["sse"] - }, - "application/vnd.las.las+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.las.las+xml": { - "source": "iana", - "extensions": ["lasxml"] - }, - "application/vnd.liberty-request+xml": { - "source": "iana" - }, - "application/vnd.llamagraphics.life-balance.desktop": { - "source": "iana", - "extensions": ["lbd"] - }, - "application/vnd.llamagraphics.life-balance.exchange+xml": { - "source": "iana", - "extensions": ["lbe"] - }, - "application/vnd.lotus-1-2-3": { - "source": "iana", - "extensions": ["123"] - }, - "application/vnd.lotus-approach": { - "source": "iana", - "extensions": ["apr"] - }, - "application/vnd.lotus-freelance": { - "source": "iana", - "extensions": ["pre"] - }, - "application/vnd.lotus-notes": { - "source": "iana", - "extensions": ["nsf"] - }, - "application/vnd.lotus-organizer": { - "source": "iana", - "extensions": ["org"] - }, - "application/vnd.lotus-screencam": { - "source": "iana", - "extensions": ["scm"] - }, - "application/vnd.lotus-wordpro": { - "source": "iana", - "extensions": ["lwp"] - }, - "application/vnd.macports.portpkg": { - "source": "iana", - "extensions": ["portpkg"] - }, - "application/vnd.mapbox-vector-tile": { - "source": "iana" - }, - "application/vnd.marlin.drm.actiontoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.conftoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.license+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.mdcf": { - "source": "iana" - }, - "application/vnd.mason+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.maxmind.maxmind-db": { - "source": "iana" - }, - "application/vnd.mcd": { - "source": "iana", - "extensions": ["mcd"] - }, - "application/vnd.medcalcdata": { - "source": "iana", - "extensions": ["mc1"] - }, - "application/vnd.mediastation.cdkey": { - "source": "iana", - "extensions": ["cdkey"] - }, - "application/vnd.meridian-slingshot": { - "source": "iana" - }, - "application/vnd.mfer": { - "source": "iana", - "extensions": ["mwf"] - }, - "application/vnd.mfmp": { - "source": "iana", - "extensions": ["mfm"] - }, - "application/vnd.micro+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.micrografx.flo": { - "source": "iana", - "extensions": ["flo"] - }, - "application/vnd.micrografx.igx": { - "source": "iana", - "extensions": ["igx"] - }, - "application/vnd.microsoft.portable-executable": { - "source": "iana" - }, - "application/vnd.microsoft.windows.thumbnail-cache": { - "source": "iana" - }, - "application/vnd.miele+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.mif": { - "source": "iana", - "extensions": ["mif"] - }, - "application/vnd.minisoft-hp3000-save": { - "source": "iana" - }, - "application/vnd.mitsubishi.misty-guard.trustweb": { - "source": "iana" - }, - "application/vnd.mobius.daf": { - "source": "iana", - "extensions": ["daf"] - }, - "application/vnd.mobius.dis": { - "source": "iana", - "extensions": ["dis"] - }, - "application/vnd.mobius.mbk": { - "source": "iana", - "extensions": ["mbk"] - }, - "application/vnd.mobius.mqy": { - "source": "iana", - "extensions": ["mqy"] - }, - "application/vnd.mobius.msl": { - "source": "iana", - "extensions": ["msl"] - }, - "application/vnd.mobius.plc": { - "source": "iana", - "extensions": ["plc"] - }, - "application/vnd.mobius.txf": { - "source": "iana", - "extensions": ["txf"] - }, - "application/vnd.mophun.application": { - "source": "iana", - "extensions": ["mpn"] - }, - "application/vnd.mophun.certificate": { - "source": "iana", - "extensions": ["mpc"] - }, - "application/vnd.motorola.flexsuite": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.adsi": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.fis": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.gotap": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.kmr": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.ttc": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.wem": { - "source": "iana" - }, - "application/vnd.motorola.iprm": { - "source": "iana" - }, - "application/vnd.mozilla.xul+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xul"] - }, - "application/vnd.ms-3mfdocument": { - "source": "iana" - }, - "application/vnd.ms-artgalry": { - "source": "iana", - "extensions": ["cil"] - }, - "application/vnd.ms-asf": { - "source": "iana" - }, - "application/vnd.ms-cab-compressed": { - "source": "iana", - "extensions": ["cab"] - }, - "application/vnd.ms-color.iccprofile": { - "source": "apache" - }, - "application/vnd.ms-excel": { - "source": "iana", - "compressible": false, - "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] - }, - "application/vnd.ms-excel.addin.macroenabled.12": { - "source": "iana", - "extensions": ["xlam"] - }, - "application/vnd.ms-excel.sheet.binary.macroenabled.12": { - "source": "iana", - "extensions": ["xlsb"] - }, - "application/vnd.ms-excel.sheet.macroenabled.12": { - "source": "iana", - "extensions": ["xlsm"] - }, - "application/vnd.ms-excel.template.macroenabled.12": { - "source": "iana", - "extensions": ["xltm"] - }, - "application/vnd.ms-fontobject": { - "source": "iana", - "compressible": true, - "extensions": ["eot"] - }, - "application/vnd.ms-htmlhelp": { - "source": "iana", - "extensions": ["chm"] - }, - "application/vnd.ms-ims": { - "source": "iana", - "extensions": ["ims"] - }, - "application/vnd.ms-lrm": { - "source": "iana", - "extensions": ["lrm"] - }, - "application/vnd.ms-office.activex+xml": { - "source": "iana" - }, - "application/vnd.ms-officetheme": { - "source": "iana", - "extensions": ["thmx"] - }, - "application/vnd.ms-opentype": { - "source": "apache", - "compressible": true - }, - "application/vnd.ms-outlook": { - "compressible": false, - "extensions": ["msg"] - }, - "application/vnd.ms-package.obfuscated-opentype": { - "source": "apache" - }, - "application/vnd.ms-pki.seccat": { - "source": "apache", - "extensions": ["cat"] - }, - "application/vnd.ms-pki.stl": { - "source": "apache", - "extensions": ["stl"] - }, - "application/vnd.ms-playready.initiator+xml": { - "source": "iana" - }, - "application/vnd.ms-powerpoint": { - "source": "iana", - "compressible": false, - "extensions": ["ppt","pps","pot"] - }, - "application/vnd.ms-powerpoint.addin.macroenabled.12": { - "source": "iana", - "extensions": ["ppam"] - }, - "application/vnd.ms-powerpoint.presentation.macroenabled.12": { - "source": "iana", - "extensions": ["pptm"] - }, - "application/vnd.ms-powerpoint.slide.macroenabled.12": { - "source": "iana", - "extensions": ["sldm"] - }, - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { - "source": "iana", - "extensions": ["ppsm"] - }, - "application/vnd.ms-powerpoint.template.macroenabled.12": { - "source": "iana", - "extensions": ["potm"] - }, - "application/vnd.ms-printdevicecapabilities+xml": { - "source": "iana" - }, - "application/vnd.ms-printing.printticket+xml": { - "source": "apache" - }, - "application/vnd.ms-printschematicket+xml": { - "source": "iana" - }, - "application/vnd.ms-project": { - "source": "iana", - "extensions": ["mpp","mpt"] - }, - "application/vnd.ms-tnef": { - "source": "iana" - }, - "application/vnd.ms-windows.devicepairing": { - "source": "iana" - }, - "application/vnd.ms-windows.nwprinting.oob": { - "source": "iana" - }, - "application/vnd.ms-windows.printerpairing": { - "source": "iana" - }, - "application/vnd.ms-windows.wsd.oob": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-resp": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-resp": { - "source": "iana" - }, - "application/vnd.ms-word.document.macroenabled.12": { - "source": "iana", - "extensions": ["docm"] - }, - "application/vnd.ms-word.template.macroenabled.12": { - "source": "iana", - "extensions": ["dotm"] - }, - "application/vnd.ms-works": { - "source": "iana", - "extensions": ["wps","wks","wcm","wdb"] - }, - "application/vnd.ms-wpl": { - "source": "iana", - "extensions": ["wpl"] - }, - "application/vnd.ms-xpsdocument": { - "source": "iana", - "compressible": false, - "extensions": ["xps"] - }, - "application/vnd.msa-disk-image": { - "source": "iana" - }, - "application/vnd.mseq": { - "source": "iana", - "extensions": ["mseq"] - }, - "application/vnd.msign": { - "source": "iana" - }, - "application/vnd.multiad.creator": { - "source": "iana" - }, - "application/vnd.multiad.creator.cif": { - "source": "iana" - }, - "application/vnd.music-niff": { - "source": "iana" - }, - "application/vnd.musician": { - "source": "iana", - "extensions": ["mus"] - }, - "application/vnd.muvee.style": { - "source": "iana", - "extensions": ["msty"] - }, - "application/vnd.mynfc": { - "source": "iana", - "extensions": ["taglet"] - }, - "application/vnd.ncd.control": { - "source": "iana" - }, - "application/vnd.ncd.reference": { - "source": "iana" - }, - "application/vnd.nearst.inv+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.nervana": { - "source": "iana" - }, - "application/vnd.netfpx": { - "source": "iana" - }, - "application/vnd.neurolanguage.nlu": { - "source": "iana", - "extensions": ["nlu"] - }, - "application/vnd.nintendo.nitro.rom": { - "source": "iana" - }, - "application/vnd.nintendo.snes.rom": { - "source": "iana" - }, - "application/vnd.nitf": { - "source": "iana", - "extensions": ["ntf","nitf"] - }, - "application/vnd.noblenet-directory": { - "source": "iana", - "extensions": ["nnd"] - }, - "application/vnd.noblenet-sealer": { - "source": "iana", - "extensions": ["nns"] - }, - "application/vnd.noblenet-web": { - "source": "iana", - "extensions": ["nnw"] - }, - "application/vnd.nokia.catalogs": { - "source": "iana" - }, - "application/vnd.nokia.conml+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.conml+xml": { - "source": "iana" - }, - "application/vnd.nokia.iptv.config+xml": { - "source": "iana" - }, - "application/vnd.nokia.isds-radio-presets": { - "source": "iana" - }, - "application/vnd.nokia.landmark+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.landmark+xml": { - "source": "iana" - }, - "application/vnd.nokia.landmarkcollection+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.ac+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.data": { - "source": "iana", - "extensions": ["ngdat"] - }, - "application/vnd.nokia.n-gage.symbian.install": { - "source": "iana", - "extensions": ["n-gage"] - }, - "application/vnd.nokia.ncd": { - "source": "iana" - }, - "application/vnd.nokia.pcd+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.pcd+xml": { - "source": "iana" - }, - "application/vnd.nokia.radio-preset": { - "source": "iana", - "extensions": ["rpst"] - }, - "application/vnd.nokia.radio-presets": { - "source": "iana", - "extensions": ["rpss"] - }, - "application/vnd.novadigm.edm": { - "source": "iana", - "extensions": ["edm"] - }, - "application/vnd.novadigm.edx": { - "source": "iana", - "extensions": ["edx"] - }, - "application/vnd.novadigm.ext": { - "source": "iana", - "extensions": ["ext"] - }, - "application/vnd.ntt-local.content-share": { - "source": "iana" - }, - "application/vnd.ntt-local.file-transfer": { - "source": "iana" - }, - "application/vnd.ntt-local.ogw_remote-access": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_remote": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_tcp_stream": { - "source": "iana" - }, - "application/vnd.oasis.opendocument.chart": { - "source": "iana", - "extensions": ["odc"] - }, - "application/vnd.oasis.opendocument.chart-template": { - "source": "iana", - "extensions": ["otc"] - }, - "application/vnd.oasis.opendocument.database": { - "source": "iana", - "extensions": ["odb"] - }, - "application/vnd.oasis.opendocument.formula": { - "source": "iana", - "extensions": ["odf"] - }, - "application/vnd.oasis.opendocument.formula-template": { - "source": "iana", - "extensions": ["odft"] - }, - "application/vnd.oasis.opendocument.graphics": { - "source": "iana", - "compressible": false, - "extensions": ["odg"] - }, - "application/vnd.oasis.opendocument.graphics-template": { - "source": "iana", - "extensions": ["otg"] - }, - "application/vnd.oasis.opendocument.image": { - "source": "iana", - "extensions": ["odi"] - }, - "application/vnd.oasis.opendocument.image-template": { - "source": "iana", - "extensions": ["oti"] - }, - "application/vnd.oasis.opendocument.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["odp"] - }, - "application/vnd.oasis.opendocument.presentation-template": { - "source": "iana", - "extensions": ["otp"] - }, - "application/vnd.oasis.opendocument.spreadsheet": { - "source": "iana", - "compressible": false, - "extensions": ["ods"] - }, - "application/vnd.oasis.opendocument.spreadsheet-template": { - "source": "iana", - "extensions": ["ots"] - }, - "application/vnd.oasis.opendocument.text": { - "source": "iana", - "compressible": false, - "extensions": ["odt"] - }, - "application/vnd.oasis.opendocument.text-master": { - "source": "iana", - "extensions": ["odm"] - }, - "application/vnd.oasis.opendocument.text-template": { - "source": "iana", - "extensions": ["ott"] - }, - "application/vnd.oasis.opendocument.text-web": { - "source": "iana", - "extensions": ["oth"] - }, - "application/vnd.obn": { - "source": "iana" - }, - "application/vnd.ocf+cbor": { - "source": "iana" - }, - "application/vnd.oftn.l10n+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oipf.contentaccessdownload+xml": { - "source": "iana" - }, - "application/vnd.oipf.contentaccessstreaming+xml": { - "source": "iana" - }, - "application/vnd.oipf.cspg-hexbinary": { - "source": "iana" - }, - "application/vnd.oipf.dae.svg+xml": { - "source": "iana" - }, - "application/vnd.oipf.dae.xhtml+xml": { - "source": "iana" - }, - "application/vnd.oipf.mippvcontrolmessage+xml": { - "source": "iana" - }, - "application/vnd.oipf.pae.gem": { - "source": "iana" - }, - "application/vnd.oipf.spdiscovery+xml": { - "source": "iana" - }, - "application/vnd.oipf.spdlist+xml": { - "source": "iana" - }, - "application/vnd.oipf.ueprofile+xml": { - "source": "iana" - }, - "application/vnd.oipf.userprofile+xml": { - "source": "iana" - }, - "application/vnd.olpc-sugar": { - "source": "iana", - "extensions": ["xo"] - }, - "application/vnd.oma-scws-config": { - "source": "iana" - }, - "application/vnd.oma-scws-http-request": { - "source": "iana" - }, - "application/vnd.oma-scws-http-response": { - "source": "iana" - }, - "application/vnd.oma.bcast.associated-procedure-parameter+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.drm-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.imd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.ltkm": { - "source": "iana" - }, - "application/vnd.oma.bcast.notification+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.provisioningtrigger": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgboot": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdu": { - "source": "iana" - }, - "application/vnd.oma.bcast.simple-symbol-container": { - "source": "iana" - }, - "application/vnd.oma.bcast.smartcard-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sprov+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.stkm": { - "source": "iana" - }, - "application/vnd.oma.cab-address-book+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-feature-handler+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-pcc+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-subs-invite+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-user-prefs+xml": { - "source": "iana" - }, - "application/vnd.oma.dcd": { - "source": "iana" - }, - "application/vnd.oma.dcdc": { - "source": "iana" - }, - "application/vnd.oma.dd2+xml": { - "source": "iana", - "extensions": ["dd2"] - }, - "application/vnd.oma.drm.risd+xml": { - "source": "iana" - }, - "application/vnd.oma.group-usage-list+xml": { - "source": "iana" - }, - "application/vnd.oma.lwm2m+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oma.lwm2m+tlv": { - "source": "iana" - }, - "application/vnd.oma.pal+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.detailed-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.final-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.groups+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.invocation-descriptor+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.optimized-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.push": { - "source": "iana" - }, - "application/vnd.oma.scidm.messages+xml": { - "source": "iana" - }, - "application/vnd.oma.xcap-directory+xml": { - "source": "iana" - }, - "application/vnd.omads-email+xml": { - "source": "iana" - }, - "application/vnd.omads-file+xml": { - "source": "iana" - }, - "application/vnd.omads-folder+xml": { - "source": "iana" - }, - "application/vnd.omaloc-supl-init": { - "source": "iana" - }, - "application/vnd.onepager": { - "source": "iana" - }, - "application/vnd.onepagertamp": { - "source": "iana" - }, - "application/vnd.onepagertamx": { - "source": "iana" - }, - "application/vnd.onepagertat": { - "source": "iana" - }, - "application/vnd.onepagertatp": { - "source": "iana" - }, - "application/vnd.onepagertatx": { - "source": "iana" - }, - "application/vnd.openblox.game+xml": { - "source": "iana" - }, - "application/vnd.openblox.game-binary": { - "source": "iana" - }, - "application/vnd.openeye.oeb": { - "source": "iana" - }, - "application/vnd.openofficeorg.extension": { - "source": "apache", - "extensions": ["oxt"] - }, - "application/vnd.openstreetmap.data+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.custom-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawing+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.extended-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["pptx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide": { - "source": "iana", - "extensions": ["sldx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { - "source": "iana", - "extensions": ["ppsx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.template": { - "source": "apache", - "extensions": ["potx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { - "source": "iana", - "compressible": false, - "extensions": ["xlsx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { - "source": "apache", - "extensions": ["xltx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.theme+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.themeoverride+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.vmldrawing": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { - "source": "iana", - "compressible": false, - "extensions": ["docx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { - "source": "apache", - "extensions": ["dotx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.core-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.relationships+xml": { - "source": "iana" - }, - "application/vnd.oracle.resource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.orange.indata": { - "source": "iana" - }, - "application/vnd.osa.netdeploy": { - "source": "iana" - }, - "application/vnd.osgeo.mapguide.package": { - "source": "iana", - "extensions": ["mgp"] - }, - "application/vnd.osgi.bundle": { - "source": "iana" - }, - "application/vnd.osgi.dp": { - "source": "iana", - "extensions": ["dp"] - }, - "application/vnd.osgi.subsystem": { - "source": "iana", - "extensions": ["esa"] - }, - "application/vnd.otps.ct-kip+xml": { - "source": "iana" - }, - "application/vnd.oxli.countgraph": { - "source": "iana" - }, - "application/vnd.pagerduty+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.palm": { - "source": "iana", - "extensions": ["pdb","pqa","oprc"] - }, - "application/vnd.panoply": { - "source": "iana" - }, - "application/vnd.paos+xml": { - "source": "iana" - }, - "application/vnd.paos.xml": { - "source": "apache" - }, - "application/vnd.pawaafile": { - "source": "iana", - "extensions": ["paw"] - }, - "application/vnd.pcos": { - "source": "iana" - }, - "application/vnd.pg.format": { - "source": "iana", - "extensions": ["str"] - }, - "application/vnd.pg.osasli": { - "source": "iana", - "extensions": ["ei6"] - }, - "application/vnd.piaccess.application-licence": { - "source": "iana" - }, - "application/vnd.picsel": { - "source": "iana", - "extensions": ["efif"] - }, - "application/vnd.pmi.widget": { - "source": "iana", - "extensions": ["wg"] - }, - "application/vnd.poc.group-advertisement+xml": { - "source": "iana" - }, - "application/vnd.pocketlearn": { - "source": "iana", - "extensions": ["plf"] - }, - "application/vnd.powerbuilder6": { - "source": "iana", - "extensions": ["pbd"] - }, - "application/vnd.powerbuilder6-s": { - "source": "iana" - }, - "application/vnd.powerbuilder7": { - "source": "iana" - }, - "application/vnd.powerbuilder7-s": { - "source": "iana" - }, - "application/vnd.powerbuilder75": { - "source": "iana" - }, - "application/vnd.powerbuilder75-s": { - "source": "iana" - }, - "application/vnd.preminet": { - "source": "iana" - }, - "application/vnd.previewsystems.box": { - "source": "iana", - "extensions": ["box"] - }, - "application/vnd.proteus.magazine": { - "source": "iana", - "extensions": ["mgz"] - }, - "application/vnd.publishare-delta-tree": { - "source": "iana", - "extensions": ["qps"] - }, - "application/vnd.pvi.ptid1": { - "source": "iana", - "extensions": ["ptid"] - }, - "application/vnd.pwg-multiplexed": { - "source": "iana" - }, - "application/vnd.pwg-xhtml-print+xml": { - "source": "iana" - }, - "application/vnd.qualcomm.brew-app-res": { - "source": "iana" - }, - "application/vnd.quarantainenet": { - "source": "iana" - }, - "application/vnd.quark.quarkxpress": { - "source": "iana", - "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] - }, - "application/vnd.quobject-quoxdocument": { - "source": "iana" - }, - "application/vnd.radisys.moml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conn+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-stream+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-base+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-detect+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-group+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-speech+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-transform+xml": { - "source": "iana" - }, - "application/vnd.rainstor.data": { - "source": "iana" - }, - "application/vnd.rapid": { - "source": "iana" - }, - "application/vnd.rar": { - "source": "iana" - }, - "application/vnd.realvnc.bed": { - "source": "iana", - "extensions": ["bed"] - }, - "application/vnd.recordare.musicxml": { - "source": "iana", - "extensions": ["mxl"] - }, - "application/vnd.recordare.musicxml+xml": { - "source": "iana", - "extensions": ["musicxml"] - }, - "application/vnd.renlearn.rlprint": { - "source": "iana" - }, - "application/vnd.rig.cryptonote": { - "source": "iana", - "extensions": ["cryptonote"] - }, - "application/vnd.rim.cod": { - "source": "apache", - "extensions": ["cod"] - }, - "application/vnd.rn-realmedia": { - "source": "apache", - "extensions": ["rm"] - }, - "application/vnd.rn-realmedia-vbr": { - "source": "apache", - "extensions": ["rmvb"] - }, - "application/vnd.route66.link66+xml": { - "source": "iana", - "extensions": ["link66"] - }, - "application/vnd.rs-274x": { - "source": "iana" - }, - "application/vnd.ruckus.download": { - "source": "iana" - }, - "application/vnd.s3sms": { - "source": "iana" - }, - "application/vnd.sailingtracker.track": { - "source": "iana", - "extensions": ["st"] - }, - "application/vnd.sbm.cid": { - "source": "iana" - }, - "application/vnd.sbm.mid2": { - "source": "iana" - }, - "application/vnd.scribus": { - "source": "iana" - }, - "application/vnd.sealed.3df": { - "source": "iana" - }, - "application/vnd.sealed.csf": { - "source": "iana" - }, - "application/vnd.sealed.doc": { - "source": "iana" - }, - "application/vnd.sealed.eml": { - "source": "iana" - }, - "application/vnd.sealed.mht": { - "source": "iana" - }, - "application/vnd.sealed.net": { - "source": "iana" - }, - "application/vnd.sealed.ppt": { - "source": "iana" - }, - "application/vnd.sealed.tiff": { - "source": "iana" - }, - "application/vnd.sealed.xls": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.html": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.pdf": { - "source": "iana" - }, - "application/vnd.seemail": { - "source": "iana", - "extensions": ["see"] - }, - "application/vnd.sema": { - "source": "iana", - "extensions": ["sema"] - }, - "application/vnd.semd": { - "source": "iana", - "extensions": ["semd"] - }, - "application/vnd.semf": { - "source": "iana", - "extensions": ["semf"] - }, - "application/vnd.shana.informed.formdata": { - "source": "iana", - "extensions": ["ifm"] - }, - "application/vnd.shana.informed.formtemplate": { - "source": "iana", - "extensions": ["itp"] - }, - "application/vnd.shana.informed.interchange": { - "source": "iana", - "extensions": ["iif"] - }, - "application/vnd.shana.informed.package": { - "source": "iana", - "extensions": ["ipk"] - }, - "application/vnd.sigrok.session": { - "source": "iana" - }, - "application/vnd.simtech-mindmapper": { - "source": "iana", - "extensions": ["twd","twds"] - }, - "application/vnd.siren+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.smaf": { - "source": "iana", - "extensions": ["mmf"] - }, - "application/vnd.smart.notebook": { - "source": "iana" - }, - "application/vnd.smart.teacher": { - "source": "iana", - "extensions": ["teacher"] - }, - "application/vnd.software602.filler.form+xml": { - "source": "iana" - }, - "application/vnd.software602.filler.form-xml-zip": { - "source": "iana" - }, - "application/vnd.solent.sdkm+xml": { - "source": "iana", - "extensions": ["sdkm","sdkd"] - }, - "application/vnd.spotfire.dxp": { - "source": "iana", - "extensions": ["dxp"] - }, - "application/vnd.spotfire.sfs": { - "source": "iana", - "extensions": ["sfs"] - }, - "application/vnd.sss-cod": { - "source": "iana" - }, - "application/vnd.sss-dtf": { - "source": "iana" - }, - "application/vnd.sss-ntf": { - "source": "iana" - }, - "application/vnd.stardivision.calc": { - "source": "apache", - "extensions": ["sdc"] - }, - "application/vnd.stardivision.draw": { - "source": "apache", - "extensions": ["sda"] - }, - "application/vnd.stardivision.impress": { - "source": "apache", - "extensions": ["sdd"] - }, - "application/vnd.stardivision.math": { - "source": "apache", - "extensions": ["smf"] - }, - "application/vnd.stardivision.writer": { - "source": "apache", - "extensions": ["sdw","vor"] - }, - "application/vnd.stardivision.writer-global": { - "source": "apache", - "extensions": ["sgl"] - }, - "application/vnd.stepmania.package": { - "source": "iana", - "extensions": ["smzip"] - }, - "application/vnd.stepmania.stepchart": { - "source": "iana", - "extensions": ["sm"] - }, - "application/vnd.street-stream": { - "source": "iana" - }, - "application/vnd.sun.wadl+xml": { - "source": "iana", - "compressible": true, - "extensions": ["wadl"] - }, - "application/vnd.sun.xml.calc": { - "source": "apache", - "extensions": ["sxc"] - }, - "application/vnd.sun.xml.calc.template": { - "source": "apache", - "extensions": ["stc"] - }, - "application/vnd.sun.xml.draw": { - "source": "apache", - "extensions": ["sxd"] - }, - "application/vnd.sun.xml.draw.template": { - "source": "apache", - "extensions": ["std"] - }, - "application/vnd.sun.xml.impress": { - "source": "apache", - "extensions": ["sxi"] - }, - "application/vnd.sun.xml.impress.template": { - "source": "apache", - "extensions": ["sti"] - }, - "application/vnd.sun.xml.math": { - "source": "apache", - "extensions": ["sxm"] - }, - "application/vnd.sun.xml.writer": { - "source": "apache", - "extensions": ["sxw"] - }, - "application/vnd.sun.xml.writer.global": { - "source": "apache", - "extensions": ["sxg"] - }, - "application/vnd.sun.xml.writer.template": { - "source": "apache", - "extensions": ["stw"] - }, - "application/vnd.sus-calendar": { - "source": "iana", - "extensions": ["sus","susp"] - }, - "application/vnd.svd": { - "source": "iana", - "extensions": ["svd"] - }, - "application/vnd.swiftview-ics": { - "source": "iana" - }, - "application/vnd.symbian.install": { - "source": "apache", - "extensions": ["sis","sisx"] - }, - "application/vnd.syncml+xml": { - "source": "iana", - "extensions": ["xsm"] - }, - "application/vnd.syncml.dm+wbxml": { - "source": "iana", - "extensions": ["bdm"] - }, - "application/vnd.syncml.dm+xml": { - "source": "iana", - "extensions": ["xdm"] - }, - "application/vnd.syncml.dm.notification": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+xml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+xml": { - "source": "iana" - }, - "application/vnd.syncml.ds.notification": { - "source": "iana" - }, - "application/vnd.tableschema+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.tao.intent-module-archive": { - "source": "iana", - "extensions": ["tao"] - }, - "application/vnd.tcpdump.pcap": { - "source": "iana", - "extensions": ["pcap","cap","dmp"] - }, - "application/vnd.tmd.mediaflex.api+xml": { - "source": "iana" - }, - "application/vnd.tml": { - "source": "iana" - }, - "application/vnd.tmobile-livetv": { - "source": "iana", - "extensions": ["tmo"] - }, - "application/vnd.tri.onesource": { - "source": "iana" - }, - "application/vnd.trid.tpt": { - "source": "iana", - "extensions": ["tpt"] - }, - "application/vnd.triscape.mxs": { - "source": "iana", - "extensions": ["mxs"] - }, - "application/vnd.trueapp": { - "source": "iana", - "extensions": ["tra"] - }, - "application/vnd.truedoc": { - "source": "iana" - }, - "application/vnd.ubisoft.webplayer": { - "source": "iana" - }, - "application/vnd.ufdl": { - "source": "iana", - "extensions": ["ufd","ufdl"] - }, - "application/vnd.uiq.theme": { - "source": "iana", - "extensions": ["utz"] - }, - "application/vnd.umajin": { - "source": "iana", - "extensions": ["umj"] - }, - "application/vnd.unity": { - "source": "iana", - "extensions": ["unityweb"] - }, - "application/vnd.uoml+xml": { - "source": "iana", - "extensions": ["uoml"] - }, - "application/vnd.uplanet.alert": { - "source": "iana" - }, - "application/vnd.uplanet.alert-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.channel": { - "source": "iana" - }, - "application/vnd.uplanet.channel-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.list": { - "source": "iana" - }, - "application/vnd.uplanet.list-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.signal": { - "source": "iana" - }, - "application/vnd.uri-map": { - "source": "iana" - }, - "application/vnd.valve.source.material": { - "source": "iana" - }, - "application/vnd.vcx": { - "source": "iana", - "extensions": ["vcx"] - }, - "application/vnd.vd-study": { - "source": "iana" - }, - "application/vnd.vectorworks": { - "source": "iana" - }, - "application/vnd.vel+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.verimatrix.vcas": { - "source": "iana" - }, - "application/vnd.vidsoft.vidconference": { - "source": "iana" - }, - "application/vnd.visio": { - "source": "iana", - "extensions": ["vsd","vst","vss","vsw"] - }, - "application/vnd.visionary": { - "source": "iana", - "extensions": ["vis"] - }, - "application/vnd.vividence.scriptfile": { - "source": "iana" - }, - "application/vnd.vsf": { - "source": "iana", - "extensions": ["vsf"] - }, - "application/vnd.wap.sic": { - "source": "iana" - }, - "application/vnd.wap.slc": { - "source": "iana" - }, - "application/vnd.wap.wbxml": { - "source": "iana", - "extensions": ["wbxml"] - }, - "application/vnd.wap.wmlc": { - "source": "iana", - "extensions": ["wmlc"] - }, - "application/vnd.wap.wmlscriptc": { - "source": "iana", - "extensions": ["wmlsc"] - }, - "application/vnd.webturbo": { - "source": "iana", - "extensions": ["wtb"] - }, - "application/vnd.wfa.p2p": { - "source": "iana" - }, - "application/vnd.wfa.wsc": { - "source": "iana" - }, - "application/vnd.windows.devicepairing": { - "source": "iana" - }, - "application/vnd.wmc": { - "source": "iana" - }, - "application/vnd.wmf.bootstrap": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica.package": { - "source": "iana" - }, - "application/vnd.wolfram.player": { - "source": "iana", - "extensions": ["nbp"] - }, - "application/vnd.wordperfect": { - "source": "iana", - "extensions": ["wpd"] - }, - "application/vnd.wqd": { - "source": "iana", - "extensions": ["wqd"] - }, - "application/vnd.wrq-hp3000-labelled": { - "source": "iana" - }, - "application/vnd.wt.stf": { - "source": "iana", - "extensions": ["stf"] - }, - "application/vnd.wv.csp+wbxml": { - "source": "iana" - }, - "application/vnd.wv.csp+xml": { - "source": "iana" - }, - "application/vnd.wv.ssp+xml": { - "source": "iana" - }, - "application/vnd.xacml+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.xara": { - "source": "iana", - "extensions": ["xar"] - }, - "application/vnd.xfdl": { - "source": "iana", - "extensions": ["xfdl"] - }, - "application/vnd.xfdl.webform": { - "source": "iana" - }, - "application/vnd.xmi+xml": { - "source": "iana" - }, - "application/vnd.xmpie.cpkg": { - "source": "iana" - }, - "application/vnd.xmpie.dpkg": { - "source": "iana" - }, - "application/vnd.xmpie.plan": { - "source": "iana" - }, - "application/vnd.xmpie.ppkg": { - "source": "iana" - }, - "application/vnd.xmpie.xlim": { - "source": "iana" - }, - "application/vnd.yamaha.hv-dic": { - "source": "iana", - "extensions": ["hvd"] - }, - "application/vnd.yamaha.hv-script": { - "source": "iana", - "extensions": ["hvs"] - }, - "application/vnd.yamaha.hv-voice": { - "source": "iana", - "extensions": ["hvp"] - }, - "application/vnd.yamaha.openscoreformat": { - "source": "iana", - "extensions": ["osf"] - }, - "application/vnd.yamaha.openscoreformat.osfpvg+xml": { - "source": "iana", - "extensions": ["osfpvg"] - }, - "application/vnd.yamaha.remote-setup": { - "source": "iana" - }, - "application/vnd.yamaha.smaf-audio": { - "source": "iana", - "extensions": ["saf"] - }, - "application/vnd.yamaha.smaf-phrase": { - "source": "iana", - "extensions": ["spf"] - }, - "application/vnd.yamaha.through-ngn": { - "source": "iana" - }, - "application/vnd.yamaha.tunnel-udpencap": { - "source": "iana" - }, - "application/vnd.yaoweme": { - "source": "iana" - }, - "application/vnd.yellowriver-custom-menu": { - "source": "iana", - "extensions": ["cmp"] - }, - "application/vnd.zul": { - "source": "iana", - "extensions": ["zir","zirz"] - }, - "application/vnd.zzazz.deck+xml": { - "source": "iana", - "extensions": ["zaz"] - }, - "application/voicexml+xml": { - "source": "iana", - "extensions": ["vxml"] - }, - "application/vq-rtcpxr": { - "source": "iana" - }, - "application/watcherinfo+xml": { - "source": "iana" - }, - "application/whoispp-query": { - "source": "iana" - }, - "application/whoispp-response": { - "source": "iana" - }, - "application/widget": { - "source": "iana", - "extensions": ["wgt"] - }, - "application/winhlp": { - "source": "apache", - "extensions": ["hlp"] - }, - "application/wita": { - "source": "iana" - }, - "application/wordperfect5.1": { - "source": "iana" - }, - "application/wsdl+xml": { - "source": "iana", - "extensions": ["wsdl"] - }, - "application/wspolicy+xml": { - "source": "iana", - "extensions": ["wspolicy"] - }, - "application/x-7z-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["7z"] - }, - "application/x-abiword": { - "source": "apache", - "extensions": ["abw"] - }, - "application/x-ace-compressed": { - "source": "apache", - "extensions": ["ace"] - }, - "application/x-amf": { - "source": "apache" - }, - "application/x-apple-diskimage": { - "source": "apache", - "extensions": ["dmg"] - }, - "application/x-arj": { - "compressible": false, - "extensions": ["arj"] - }, - "application/x-authorware-bin": { - "source": "apache", - "extensions": ["aab","x32","u32","vox"] - }, - "application/x-authorware-map": { - "source": "apache", - "extensions": ["aam"] - }, - "application/x-authorware-seg": { - "source": "apache", - "extensions": ["aas"] - }, - "application/x-bcpio": { - "source": "apache", - "extensions": ["bcpio"] - }, - "application/x-bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/x-bittorrent": { - "source": "apache", - "extensions": ["torrent"] - }, - "application/x-blorb": { - "source": "apache", - "extensions": ["blb","blorb"] - }, - "application/x-bzip": { - "source": "apache", - "compressible": false, - "extensions": ["bz"] - }, - "application/x-bzip2": { - "source": "apache", - "compressible": false, - "extensions": ["bz2","boz"] - }, - "application/x-cbr": { - "source": "apache", - "extensions": ["cbr","cba","cbt","cbz","cb7"] - }, - "application/x-cdlink": { - "source": "apache", - "extensions": ["vcd"] - }, - "application/x-cfs-compressed": { - "source": "apache", - "extensions": ["cfs"] - }, - "application/x-chat": { - "source": "apache", - "extensions": ["chat"] - }, - "application/x-chess-pgn": { - "source": "apache", - "extensions": ["pgn"] - }, - "application/x-chrome-extension": { - "extensions": ["crx"] - }, - "application/x-cocoa": { - "source": "nginx", - "extensions": ["cco"] - }, - "application/x-compress": { - "source": "apache" - }, - "application/x-conference": { - "source": "apache", - "extensions": ["nsc"] - }, - "application/x-cpio": { - "source": "apache", - "extensions": ["cpio"] - }, - "application/x-csh": { - "source": "apache", - "extensions": ["csh"] - }, - "application/x-deb": { - "compressible": false - }, - "application/x-debian-package": { - "source": "apache", - "extensions": ["deb","udeb"] - }, - "application/x-dgc-compressed": { - "source": "apache", - "extensions": ["dgc"] - }, - "application/x-director": { - "source": "apache", - "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] - }, - "application/x-doom": { - "source": "apache", - "extensions": ["wad"] - }, - "application/x-dtbncx+xml": { - "source": "apache", - "extensions": ["ncx"] - }, - "application/x-dtbook+xml": { - "source": "apache", - "extensions": ["dtb"] - }, - "application/x-dtbresource+xml": { - "source": "apache", - "extensions": ["res"] - }, - "application/x-dvi": { - "source": "apache", - "compressible": false, - "extensions": ["dvi"] - }, - "application/x-envoy": { - "source": "apache", - "extensions": ["evy"] - }, - "application/x-eva": { - "source": "apache", - "extensions": ["eva"] - }, - "application/x-font-bdf": { - "source": "apache", - "extensions": ["bdf"] - }, - "application/x-font-dos": { - "source": "apache" - }, - "application/x-font-framemaker": { - "source": "apache" - }, - "application/x-font-ghostscript": { - "source": "apache", - "extensions": ["gsf"] - }, - "application/x-font-libgrx": { - "source": "apache" - }, - "application/x-font-linux-psf": { - "source": "apache", - "extensions": ["psf"] - }, - "application/x-font-otf": { - "source": "apache", - "compressible": true, - "extensions": ["otf"] - }, - "application/x-font-pcf": { - "source": "apache", - "extensions": ["pcf"] - }, - "application/x-font-snf": { - "source": "apache", - "extensions": ["snf"] - }, - "application/x-font-speedo": { - "source": "apache" - }, - "application/x-font-sunos-news": { - "source": "apache" - }, - "application/x-font-ttf": { - "source": "apache", - "compressible": true, - "extensions": ["ttf","ttc"] - }, - "application/x-font-type1": { - "source": "apache", - "extensions": ["pfa","pfb","pfm","afm"] - }, - "application/x-font-vfont": { - "source": "apache" - }, - "application/x-freearc": { - "source": "apache", - "extensions": ["arc"] - }, - "application/x-futuresplash": { - "source": "apache", - "extensions": ["spl"] - }, - "application/x-gca-compressed": { - "source": "apache", - "extensions": ["gca"] - }, - "application/x-glulx": { - "source": "apache", - "extensions": ["ulx"] - }, - "application/x-gnumeric": { - "source": "apache", - "extensions": ["gnumeric"] - }, - "application/x-gramps-xml": { - "source": "apache", - "extensions": ["gramps"] - }, - "application/x-gtar": { - "source": "apache", - "extensions": ["gtar"] - }, - "application/x-gzip": { - "source": "apache" - }, - "application/x-hdf": { - "source": "apache", - "extensions": ["hdf"] - }, - "application/x-httpd-php": { - "compressible": true, - "extensions": ["php"] - }, - "application/x-install-instructions": { - "source": "apache", - "extensions": ["install"] - }, - "application/x-iso9660-image": { - "source": "apache", - "extensions": ["iso"] - }, - "application/x-java-archive-diff": { - "source": "nginx", - "extensions": ["jardiff"] - }, - "application/x-java-jnlp-file": { - "source": "apache", - "compressible": false, - "extensions": ["jnlp"] - }, - "application/x-javascript": { - "compressible": true - }, - "application/x-latex": { - "source": "apache", - "compressible": false, - "extensions": ["latex"] - }, - "application/x-lua-bytecode": { - "extensions": ["luac"] - }, - "application/x-lzh-compressed": { - "source": "apache", - "extensions": ["lzh","lha"] - }, - "application/x-makeself": { - "source": "nginx", - "extensions": ["run"] - }, - "application/x-mie": { - "source": "apache", - "extensions": ["mie"] - }, - "application/x-mobipocket-ebook": { - "source": "apache", - "extensions": ["prc","mobi"] - }, - "application/x-mpegurl": { - "compressible": false - }, - "application/x-ms-application": { - "source": "apache", - "extensions": ["application"] - }, - "application/x-ms-shortcut": { - "source": "apache", - "extensions": ["lnk"] - }, - "application/x-ms-wmd": { - "source": "apache", - "extensions": ["wmd"] - }, - "application/x-ms-wmz": { - "source": "apache", - "extensions": ["wmz"] - }, - "application/x-ms-xbap": { - "source": "apache", - "extensions": ["xbap"] - }, - "application/x-msaccess": { - "source": "apache", - "extensions": ["mdb"] - }, - "application/x-msbinder": { - "source": "apache", - "extensions": ["obd"] - }, - "application/x-mscardfile": { - "source": "apache", - "extensions": ["crd"] - }, - "application/x-msclip": { - "source": "apache", - "extensions": ["clp"] - }, - "application/x-msdos-program": { - "extensions": ["exe"] - }, - "application/x-msdownload": { - "source": "apache", - "extensions": ["exe","dll","com","bat","msi"] - }, - "application/x-msmediaview": { - "source": "apache", - "extensions": ["mvb","m13","m14"] - }, - "application/x-msmetafile": { - "source": "apache", - "extensions": ["wmf","wmz","emf","emz"] - }, - "application/x-msmoney": { - "source": "apache", - "extensions": ["mny"] - }, - "application/x-mspublisher": { - "source": "apache", - "extensions": ["pub"] - }, - "application/x-msschedule": { - "source": "apache", - "extensions": ["scd"] - }, - "application/x-msterminal": { - "source": "apache", - "extensions": ["trm"] - }, - "application/x-mswrite": { - "source": "apache", - "extensions": ["wri"] - }, - "application/x-netcdf": { - "source": "apache", - "extensions": ["nc","cdf"] - }, - "application/x-ns-proxy-autoconfig": { - "compressible": true, - "extensions": ["pac"] - }, - "application/x-nzb": { - "source": "apache", - "extensions": ["nzb"] - }, - "application/x-perl": { - "source": "nginx", - "extensions": ["pl","pm"] - }, - "application/x-pilot": { - "source": "nginx", - "extensions": ["prc","pdb"] - }, - "application/x-pkcs12": { - "source": "apache", - "compressible": false, - "extensions": ["p12","pfx"] - }, - "application/x-pkcs7-certificates": { - "source": "apache", - "extensions": ["p7b","spc"] - }, - "application/x-pkcs7-certreqresp": { - "source": "apache", - "extensions": ["p7r"] - }, - "application/x-rar-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["rar"] - }, - "application/x-redhat-package-manager": { - "source": "nginx", - "extensions": ["rpm"] - }, - "application/x-research-info-systems": { - "source": "apache", - "extensions": ["ris"] - }, - "application/x-sea": { - "source": "nginx", - "extensions": ["sea"] - }, - "application/x-sh": { - "source": "apache", - "compressible": true, - "extensions": ["sh"] - }, - "application/x-shar": { - "source": "apache", - "extensions": ["shar"] - }, - "application/x-shockwave-flash": { - "source": "apache", - "compressible": false, - "extensions": ["swf"] - }, - "application/x-silverlight-app": { - "source": "apache", - "extensions": ["xap"] - }, - "application/x-sql": { - "source": "apache", - "extensions": ["sql"] - }, - "application/x-stuffit": { - "source": "apache", - "compressible": false, - "extensions": ["sit"] - }, - "application/x-stuffitx": { - "source": "apache", - "extensions": ["sitx"] - }, - "application/x-subrip": { - "source": "apache", - "extensions": ["srt"] - }, - "application/x-sv4cpio": { - "source": "apache", - "extensions": ["sv4cpio"] - }, - "application/x-sv4crc": { - "source": "apache", - "extensions": ["sv4crc"] - }, - "application/x-t3vm-image": { - "source": "apache", - "extensions": ["t3"] - }, - "application/x-tads": { - "source": "apache", - "extensions": ["gam"] - }, - "application/x-tar": { - "source": "apache", - "compressible": true, - "extensions": ["tar"] - }, - "application/x-tcl": { - "source": "apache", - "extensions": ["tcl","tk"] - }, - "application/x-tex": { - "source": "apache", - "extensions": ["tex"] - }, - "application/x-tex-tfm": { - "source": "apache", - "extensions": ["tfm"] - }, - "application/x-texinfo": { - "source": "apache", - "extensions": ["texinfo","texi"] - }, - "application/x-tgif": { - "source": "apache", - "extensions": ["obj"] - }, - "application/x-ustar": { - "source": "apache", - "extensions": ["ustar"] - }, - "application/x-virtualbox-hdd": { - "compressible": true, - "extensions": ["hdd"] - }, - "application/x-virtualbox-ova": { - "compressible": true, - "extensions": ["ova"] - }, - "application/x-virtualbox-ovf": { - "compressible": true, - "extensions": ["ovf"] - }, - "application/x-virtualbox-vbox": { - "compressible": true, - "extensions": ["vbox"] - }, - "application/x-virtualbox-vbox-extpack": { - "compressible": false, - "extensions": ["vbox-extpack"] - }, - "application/x-virtualbox-vdi": { - "compressible": true, - "extensions": ["vdi"] - }, - "application/x-virtualbox-vhd": { - "compressible": true, - "extensions": ["vhd"] - }, - "application/x-virtualbox-vmdk": { - "compressible": true, - "extensions": ["vmdk"] - }, - "application/x-wais-source": { - "source": "apache", - "extensions": ["src"] - }, - "application/x-web-app-manifest+json": { - "compressible": true, - "extensions": ["webapp"] - }, - "application/x-www-form-urlencoded": { - "source": "iana", - "compressible": true - }, - "application/x-x509-ca-cert": { - "source": "apache", - "extensions": ["der","crt","pem"] - }, - "application/x-xfig": { - "source": "apache", - "extensions": ["fig"] - }, - "application/x-xliff+xml": { - "source": "apache", - "extensions": ["xlf"] - }, - "application/x-xpinstall": { - "source": "apache", - "compressible": false, - "extensions": ["xpi"] - }, - "application/x-xz": { - "source": "apache", - "extensions": ["xz"] - }, - "application/x-zmachine": { - "source": "apache", - "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] - }, - "application/x400-bp": { - "source": "iana" - }, - "application/xacml+xml": { - "source": "iana" - }, - "application/xaml+xml": { - "source": "apache", - "extensions": ["xaml"] - }, - "application/xcap-att+xml": { - "source": "iana" - }, - "application/xcap-caps+xml": { - "source": "iana" - }, - "application/xcap-diff+xml": { - "source": "iana", - "extensions": ["xdf"] - }, - "application/xcap-el+xml": { - "source": "iana" - }, - "application/xcap-error+xml": { - "source": "iana" - }, - "application/xcap-ns+xml": { - "source": "iana" - }, - "application/xcon-conference-info+xml": { - "source": "iana" - }, - "application/xcon-conference-info-diff+xml": { - "source": "iana" - }, - "application/xenc+xml": { - "source": "iana", - "extensions": ["xenc"] - }, - "application/xhtml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xhtml","xht"] - }, - "application/xhtml-voice+xml": { - "source": "apache" - }, - "application/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml","xsl","xsd","rng"] - }, - "application/xml-dtd": { - "source": "iana", - "compressible": true, - "extensions": ["dtd"] - }, - "application/xml-external-parsed-entity": { - "source": "iana" - }, - "application/xml-patch+xml": { - "source": "iana" - }, - "application/xmpp+xml": { - "source": "iana" - }, - "application/xop+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xop"] - }, - "application/xproc+xml": { - "source": "apache", - "extensions": ["xpl"] - }, - "application/xslt+xml": { - "source": "iana", - "extensions": ["xslt"] - }, - "application/xspf+xml": { - "source": "apache", - "extensions": ["xspf"] - }, - "application/xv+xml": { - "source": "iana", - "extensions": ["mxml","xhvml","xvml","xvm"] - }, - "application/yang": { - "source": "iana", - "extensions": ["yang"] - }, - "application/yang-data+json": { - "source": "iana", - "compressible": true - }, - "application/yang-data+xml": { - "source": "iana" - }, - "application/yang-patch+json": { - "source": "iana", - "compressible": true - }, - "application/yang-patch+xml": { - "source": "iana" - }, - "application/yin+xml": { - "source": "iana", - "extensions": ["yin"] - }, - "application/zip": { - "source": "iana", - "compressible": false, - "extensions": ["zip"] - }, - "application/zlib": { - "source": "iana" - }, - "audio/1d-interleaved-parityfec": { - "source": "iana" - }, - "audio/32kadpcm": { - "source": "iana" - }, - "audio/3gpp": { - "source": "iana", - "compressible": false, - "extensions": ["3gpp"] - }, - "audio/3gpp2": { - "source": "iana" - }, - "audio/ac3": { - "source": "iana" - }, - "audio/adpcm": { - "source": "apache", - "extensions": ["adp"] - }, - "audio/amr": { - "source": "iana" - }, - "audio/amr-wb": { - "source": "iana" - }, - "audio/amr-wb+": { - "source": "iana" - }, - "audio/aptx": { - "source": "iana" - }, - "audio/asc": { - "source": "iana" - }, - "audio/atrac-advanced-lossless": { - "source": "iana" - }, - "audio/atrac-x": { - "source": "iana" - }, - "audio/atrac3": { - "source": "iana" - }, - "audio/basic": { - "source": "iana", - "compressible": false, - "extensions": ["au","snd"] - }, - "audio/bv16": { - "source": "iana" - }, - "audio/bv32": { - "source": "iana" - }, - "audio/clearmode": { - "source": "iana" - }, - "audio/cn": { - "source": "iana" - }, - "audio/dat12": { - "source": "iana" - }, - "audio/dls": { - "source": "iana" - }, - "audio/dsr-es201108": { - "source": "iana" - }, - "audio/dsr-es202050": { - "source": "iana" - }, - "audio/dsr-es202211": { - "source": "iana" - }, - "audio/dsr-es202212": { - "source": "iana" - }, - "audio/dv": { - "source": "iana" - }, - "audio/dvi4": { - "source": "iana" - }, - "audio/eac3": { - "source": "iana" - }, - "audio/encaprtp": { - "source": "iana" - }, - "audio/evrc": { - "source": "iana" - }, - "audio/evrc-qcp": { - "source": "iana" - }, - "audio/evrc0": { - "source": "iana" - }, - "audio/evrc1": { - "source": "iana" - }, - "audio/evrcb": { - "source": "iana" - }, - "audio/evrcb0": { - "source": "iana" - }, - "audio/evrcb1": { - "source": "iana" - }, - "audio/evrcnw": { - "source": "iana" - }, - "audio/evrcnw0": { - "source": "iana" - }, - "audio/evrcnw1": { - "source": "iana" - }, - "audio/evrcwb": { - "source": "iana" - }, - "audio/evrcwb0": { - "source": "iana" - }, - "audio/evrcwb1": { - "source": "iana" - }, - "audio/evs": { - "source": "iana" - }, - "audio/fwdred": { - "source": "iana" - }, - "audio/g711-0": { - "source": "iana" - }, - "audio/g719": { - "source": "iana" - }, - "audio/g722": { - "source": "iana" - }, - "audio/g7221": { - "source": "iana" - }, - "audio/g723": { - "source": "iana" - }, - "audio/g726-16": { - "source": "iana" - }, - "audio/g726-24": { - "source": "iana" - }, - "audio/g726-32": { - "source": "iana" - }, - "audio/g726-40": { - "source": "iana" - }, - "audio/g728": { - "source": "iana" - }, - "audio/g729": { - "source": "iana" - }, - "audio/g7291": { - "source": "iana" - }, - "audio/g729d": { - "source": "iana" - }, - "audio/g729e": { - "source": "iana" - }, - "audio/gsm": { - "source": "iana" - }, - "audio/gsm-efr": { - "source": "iana" - }, - "audio/gsm-hr-08": { - "source": "iana" - }, - "audio/ilbc": { - "source": "iana" - }, - "audio/ip-mr_v2.5": { - "source": "iana" - }, - "audio/isac": { - "source": "apache" - }, - "audio/l16": { - "source": "iana" - }, - "audio/l20": { - "source": "iana" - }, - "audio/l24": { - "source": "iana", - "compressible": false - }, - "audio/l8": { - "source": "iana" - }, - "audio/lpc": { - "source": "iana" - }, - "audio/melp": { - "source": "iana" - }, - "audio/melp1200": { - "source": "iana" - }, - "audio/melp2400": { - "source": "iana" - }, - "audio/melp600": { - "source": "iana" - }, - "audio/midi": { - "source": "apache", - "extensions": ["mid","midi","kar","rmi"] - }, - "audio/mobile-xmf": { - "source": "iana" - }, - "audio/mp3": { - "compressible": false, - "extensions": ["mp3"] - }, - "audio/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["m4a","mp4a"] - }, - "audio/mp4a-latm": { - "source": "iana" - }, - "audio/mpa": { - "source": "iana" - }, - "audio/mpa-robust": { - "source": "iana" - }, - "audio/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] - }, - "audio/mpeg4-generic": { - "source": "iana" - }, - "audio/musepack": { - "source": "apache" - }, - "audio/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["oga","ogg","spx"] - }, - "audio/opus": { - "source": "iana" - }, - "audio/parityfec": { - "source": "iana" - }, - "audio/pcma": { - "source": "iana" - }, - "audio/pcma-wb": { - "source": "iana" - }, - "audio/pcmu": { - "source": "iana" - }, - "audio/pcmu-wb": { - "source": "iana" - }, - "audio/prs.sid": { - "source": "iana" - }, - "audio/qcelp": { - "source": "iana" - }, - "audio/raptorfec": { - "source": "iana" - }, - "audio/red": { - "source": "iana" - }, - "audio/rtp-enc-aescm128": { - "source": "iana" - }, - "audio/rtp-midi": { - "source": "iana" - }, - "audio/rtploopback": { - "source": "iana" - }, - "audio/rtx": { - "source": "iana" - }, - "audio/s3m": { - "source": "apache", - "extensions": ["s3m"] - }, - "audio/silk": { - "source": "apache", - "extensions": ["sil"] - }, - "audio/smv": { - "source": "iana" - }, - "audio/smv-qcp": { - "source": "iana" - }, - "audio/smv0": { - "source": "iana" - }, - "audio/sp-midi": { - "source": "iana" - }, - "audio/speex": { - "source": "iana" - }, - "audio/t140c": { - "source": "iana" - }, - "audio/t38": { - "source": "iana" - }, - "audio/telephone-event": { - "source": "iana" - }, - "audio/tone": { - "source": "iana" - }, - "audio/uemclip": { - "source": "iana" - }, - "audio/ulpfec": { - "source": "iana" - }, - "audio/vdvi": { - "source": "iana" - }, - "audio/vmr-wb": { - "source": "iana" - }, - "audio/vnd.3gpp.iufp": { - "source": "iana" - }, - "audio/vnd.4sb": { - "source": "iana" - }, - "audio/vnd.audiokoz": { - "source": "iana" - }, - "audio/vnd.celp": { - "source": "iana" - }, - "audio/vnd.cisco.nse": { - "source": "iana" - }, - "audio/vnd.cmles.radio-events": { - "source": "iana" - }, - "audio/vnd.cns.anp1": { - "source": "iana" - }, - "audio/vnd.cns.inf1": { - "source": "iana" - }, - "audio/vnd.dece.audio": { - "source": "iana", - "extensions": ["uva","uvva"] - }, - "audio/vnd.digital-winds": { - "source": "iana", - "extensions": ["eol"] - }, - "audio/vnd.dlna.adts": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.1": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.2": { - "source": "iana" - }, - "audio/vnd.dolby.mlp": { - "source": "iana" - }, - "audio/vnd.dolby.mps": { - "source": "iana" - }, - "audio/vnd.dolby.pl2": { - "source": "iana" - }, - "audio/vnd.dolby.pl2x": { - "source": "iana" - }, - "audio/vnd.dolby.pl2z": { - "source": "iana" - }, - "audio/vnd.dolby.pulse.1": { - "source": "iana" - }, - "audio/vnd.dra": { - "source": "iana", - "extensions": ["dra"] - }, - "audio/vnd.dts": { - "source": "iana", - "extensions": ["dts"] - }, - "audio/vnd.dts.hd": { - "source": "iana", - "extensions": ["dtshd"] - }, - "audio/vnd.dvb.file": { - "source": "iana" - }, - "audio/vnd.everad.plj": { - "source": "iana" - }, - "audio/vnd.hns.audio": { - "source": "iana" - }, - "audio/vnd.lucent.voice": { - "source": "iana", - "extensions": ["lvp"] - }, - "audio/vnd.ms-playready.media.pya": { - "source": "iana", - "extensions": ["pya"] - }, - "audio/vnd.nokia.mobile-xmf": { - "source": "iana" - }, - "audio/vnd.nortel.vbk": { - "source": "iana" - }, - "audio/vnd.nuera.ecelp4800": { - "source": "iana", - "extensions": ["ecelp4800"] - }, - "audio/vnd.nuera.ecelp7470": { - "source": "iana", - "extensions": ["ecelp7470"] - }, - "audio/vnd.nuera.ecelp9600": { - "source": "iana", - "extensions": ["ecelp9600"] - }, - "audio/vnd.octel.sbc": { - "source": "iana" - }, - "audio/vnd.presonus.multitrack": { - "source": "iana" - }, - "audio/vnd.qcelp": { - "source": "iana" - }, - "audio/vnd.rhetorex.32kadpcm": { - "source": "iana" - }, - "audio/vnd.rip": { - "source": "iana", - "extensions": ["rip"] - }, - "audio/vnd.rn-realaudio": { - "compressible": false - }, - "audio/vnd.sealedmedia.softseal.mpeg": { - "source": "iana" - }, - "audio/vnd.vmx.cvsd": { - "source": "iana" - }, - "audio/vnd.wave": { - "compressible": false - }, - "audio/vorbis": { - "source": "iana", - "compressible": false - }, - "audio/vorbis-config": { - "source": "iana" - }, - "audio/wav": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/wave": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/webm": { - "source": "apache", - "compressible": false, - "extensions": ["weba"] - }, - "audio/x-aac": { - "source": "apache", - "compressible": false, - "extensions": ["aac"] - }, - "audio/x-aiff": { - "source": "apache", - "extensions": ["aif","aiff","aifc"] - }, - "audio/x-caf": { - "source": "apache", - "compressible": false, - "extensions": ["caf"] - }, - "audio/x-flac": { - "source": "apache", - "extensions": ["flac"] - }, - "audio/x-m4a": { - "source": "nginx", - "extensions": ["m4a"] - }, - "audio/x-matroska": { - "source": "apache", - "extensions": ["mka"] - }, - "audio/x-mpegurl": { - "source": "apache", - "extensions": ["m3u"] - }, - "audio/x-ms-wax": { - "source": "apache", - "extensions": ["wax"] - }, - "audio/x-ms-wma": { - "source": "apache", - "extensions": ["wma"] - }, - "audio/x-pn-realaudio": { - "source": "apache", - "extensions": ["ram","ra"] - }, - "audio/x-pn-realaudio-plugin": { - "source": "apache", - "extensions": ["rmp"] - }, - "audio/x-realaudio": { - "source": "nginx", - "extensions": ["ra"] - }, - "audio/x-tta": { - "source": "apache" - }, - "audio/x-wav": { - "source": "apache", - "extensions": ["wav"] - }, - "audio/xm": { - "source": "apache", - "extensions": ["xm"] - }, - "chemical/x-cdx": { - "source": "apache", - "extensions": ["cdx"] - }, - "chemical/x-cif": { - "source": "apache", - "extensions": ["cif"] - }, - "chemical/x-cmdf": { - "source": "apache", - "extensions": ["cmdf"] - }, - "chemical/x-cml": { - "source": "apache", - "extensions": ["cml"] - }, - "chemical/x-csml": { - "source": "apache", - "extensions": ["csml"] - }, - "chemical/x-pdb": { - "source": "apache" - }, - "chemical/x-xyz": { - "source": "apache", - "extensions": ["xyz"] - }, - "font/otf": { - "compressible": true, - "extensions": ["otf"] - }, - "image/apng": { - "compressible": false, - "extensions": ["apng"] - }, - "image/bmp": { - "source": "iana", - "compressible": true, - "extensions": ["bmp"] - }, - "image/cgm": { - "source": "iana", - "extensions": ["cgm"] - }, - "image/dicom-rle": { - "source": "iana" - }, - "image/emf": { - "source": "iana" - }, - "image/fits": { - "source": "iana" - }, - "image/g3fax": { - "source": "iana", - "extensions": ["g3"] - }, - "image/gif": { - "source": "iana", - "compressible": false, - "extensions": ["gif"] - }, - "image/ief": { - "source": "iana", - "extensions": ["ief"] - }, - "image/jls": { - "source": "iana" - }, - "image/jp2": { - "source": "iana" - }, - "image/jpeg": { - "source": "iana", - "compressible": false, - "extensions": ["jpeg","jpg","jpe"] - }, - "image/jpm": { - "source": "iana" - }, - "image/jpx": { - "source": "iana" - }, - "image/ktx": { - "source": "iana", - "extensions": ["ktx"] - }, - "image/naplps": { - "source": "iana" - }, - "image/pjpeg": { - "compressible": false - }, - "image/png": { - "source": "iana", - "compressible": false, - "extensions": ["png"] - }, - "image/prs.btif": { - "source": "iana", - "extensions": ["btif"] - }, - "image/prs.pti": { - "source": "iana" - }, - "image/pwg-raster": { - "source": "iana" - }, - "image/sgi": { - "source": "apache", - "extensions": ["sgi"] - }, - "image/svg+xml": { - "source": "iana", - "compressible": true, - "extensions": ["svg","svgz"] - }, - "image/t38": { - "source": "iana" - }, - "image/tiff": { - "source": "iana", - "compressible": false, - "extensions": ["tiff","tif"] - }, - "image/tiff-fx": { - "source": "iana" - }, - "image/vnd.adobe.photoshop": { - "source": "iana", - "compressible": true, - "extensions": ["psd"] - }, - "image/vnd.airzip.accelerator.azv": { - "source": "iana" - }, - "image/vnd.cns.inf2": { - "source": "iana" - }, - "image/vnd.dece.graphic": { - "source": "iana", - "extensions": ["uvi","uvvi","uvg","uvvg"] - }, - "image/vnd.djvu": { - "source": "iana", - "extensions": ["djvu","djv"] - }, - "image/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "image/vnd.dwg": { - "source": "iana", - "extensions": ["dwg"] - }, - "image/vnd.dxf": { - "source": "iana", - "extensions": ["dxf"] - }, - "image/vnd.fastbidsheet": { - "source": "iana", - "extensions": ["fbs"] - }, - "image/vnd.fpx": { - "source": "iana", - "extensions": ["fpx"] - }, - "image/vnd.fst": { - "source": "iana", - "extensions": ["fst"] - }, - "image/vnd.fujixerox.edmics-mmr": { - "source": "iana", - "extensions": ["mmr"] - }, - "image/vnd.fujixerox.edmics-rlc": { - "source": "iana", - "extensions": ["rlc"] - }, - "image/vnd.globalgraphics.pgb": { - "source": "iana" - }, - "image/vnd.microsoft.icon": { - "source": "iana" - }, - "image/vnd.mix": { - "source": "iana" - }, - "image/vnd.mozilla.apng": { - "source": "iana" - }, - "image/vnd.ms-modi": { - "source": "iana", - "extensions": ["mdi"] - }, - "image/vnd.ms-photo": { - "source": "apache", - "extensions": ["wdp"] - }, - "image/vnd.net-fpx": { - "source": "iana", - "extensions": ["npx"] - }, - "image/vnd.radiance": { - "source": "iana" - }, - "image/vnd.sealed.png": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.gif": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.jpg": { - "source": "iana" - }, - "image/vnd.svf": { - "source": "iana" - }, - "image/vnd.tencent.tap": { - "source": "iana" - }, - "image/vnd.valve.source.texture": { - "source": "iana" - }, - "image/vnd.wap.wbmp": { - "source": "iana", - "extensions": ["wbmp"] - }, - "image/vnd.xiff": { - "source": "iana", - "extensions": ["xif"] - }, - "image/vnd.zbrush.pcx": { - "source": "iana" - }, - "image/webp": { - "source": "apache", - "extensions": ["webp"] - }, - "image/wmf": { - "source": "iana" - }, - "image/x-3ds": { - "source": "apache", - "extensions": ["3ds"] - }, - "image/x-cmu-raster": { - "source": "apache", - "extensions": ["ras"] - }, - "image/x-cmx": { - "source": "apache", - "extensions": ["cmx"] - }, - "image/x-freehand": { - "source": "apache", - "extensions": ["fh","fhc","fh4","fh5","fh7"] - }, - "image/x-icon": { - "source": "apache", - "compressible": true, - "extensions": ["ico"] - }, - "image/x-jng": { - "source": "nginx", - "extensions": ["jng"] - }, - "image/x-mrsid-image": { - "source": "apache", - "extensions": ["sid"] - }, - "image/x-ms-bmp": { - "source": "nginx", - "compressible": true, - "extensions": ["bmp"] - }, - "image/x-pcx": { - "source": "apache", - "extensions": ["pcx"] - }, - "image/x-pict": { - "source": "apache", - "extensions": ["pic","pct"] - }, - "image/x-portable-anymap": { - "source": "apache", - "extensions": ["pnm"] - }, - "image/x-portable-bitmap": { - "source": "apache", - "extensions": ["pbm"] - }, - "image/x-portable-graymap": { - "source": "apache", - "extensions": ["pgm"] - }, - "image/x-portable-pixmap": { - "source": "apache", - "extensions": ["ppm"] - }, - "image/x-rgb": { - "source": "apache", - "extensions": ["rgb"] - }, - "image/x-tga": { - "source": "apache", - "extensions": ["tga"] - }, - "image/x-xbitmap": { - "source": "apache", - "extensions": ["xbm"] - }, - "image/x-xcf": { - "compressible": false - }, - "image/x-xpixmap": { - "source": "apache", - "extensions": ["xpm"] - }, - "image/x-xwindowdump": { - "source": "apache", - "extensions": ["xwd"] - }, - "message/cpim": { - "source": "iana" - }, - "message/delivery-status": { - "source": "iana" - }, - "message/disposition-notification": { - "source": "iana" - }, - "message/external-body": { - "source": "iana" - }, - "message/feedback-report": { - "source": "iana" - }, - "message/global": { - "source": "iana" - }, - "message/global-delivery-status": { - "source": "iana" - }, - "message/global-disposition-notification": { - "source": "iana" - }, - "message/global-headers": { - "source": "iana" - }, - "message/http": { - "source": "iana", - "compressible": false - }, - "message/imdn+xml": { - "source": "iana", - "compressible": true - }, - "message/news": { - "source": "iana" - }, - "message/partial": { - "source": "iana", - "compressible": false - }, - "message/rfc822": { - "source": "iana", - "compressible": true, - "extensions": ["eml","mime"] - }, - "message/s-http": { - "source": "iana" - }, - "message/sip": { - "source": "iana" - }, - "message/sipfrag": { - "source": "iana" - }, - "message/tracking-status": { - "source": "iana" - }, - "message/vnd.si.simp": { - "source": "iana" - }, - "message/vnd.wfa.wsc": { - "source": "iana" - }, - "model/3mf": { - "source": "iana" - }, - "model/gltf+json": { - "source": "iana", - "compressible": true, - "extensions": ["gltf"] - }, - "model/gltf-binary": { - "compressible": true, - "extensions": ["glb"] - }, - "model/iges": { - "source": "iana", - "compressible": false, - "extensions": ["igs","iges"] - }, - "model/mesh": { - "source": "iana", - "compressible": false, - "extensions": ["msh","mesh","silo"] - }, - "model/vnd.collada+xml": { - "source": "iana", - "extensions": ["dae"] - }, - "model/vnd.dwf": { - "source": "iana", - "extensions": ["dwf"] - }, - "model/vnd.flatland.3dml": { - "source": "iana" - }, - "model/vnd.gdl": { - "source": "iana", - "extensions": ["gdl"] - }, - "model/vnd.gs-gdl": { - "source": "apache" - }, - "model/vnd.gs.gdl": { - "source": "iana" - }, - "model/vnd.gtw": { - "source": "iana", - "extensions": ["gtw"] - }, - "model/vnd.moml+xml": { - "source": "iana" - }, - "model/vnd.mts": { - "source": "iana", - "extensions": ["mts"] - }, - "model/vnd.opengex": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.binary": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.text": { - "source": "iana" - }, - "model/vnd.rosette.annotated-data-model": { - "source": "iana" - }, - "model/vnd.valve.source.compiled-map": { - "source": "iana" - }, - "model/vnd.vtu": { - "source": "iana", - "extensions": ["vtu"] - }, - "model/vrml": { - "source": "iana", - "compressible": false, - "extensions": ["wrl","vrml"] - }, - "model/x3d+binary": { - "source": "apache", - "compressible": false, - "extensions": ["x3db","x3dbz"] - }, - "model/x3d+fastinfoset": { - "source": "iana" - }, - "model/x3d+vrml": { - "source": "apache", - "compressible": false, - "extensions": ["x3dv","x3dvz"] - }, - "model/x3d+xml": { - "source": "iana", - "compressible": true, - "extensions": ["x3d","x3dz"] - }, - "model/x3d-vrml": { - "source": "iana" - }, - "multipart/alternative": { - "source": "iana", - "compressible": false - }, - "multipart/appledouble": { - "source": "iana" - }, - "multipart/byteranges": { - "source": "iana" - }, - "multipart/digest": { - "source": "iana" - }, - "multipart/encrypted": { - "source": "iana", - "compressible": false - }, - "multipart/form-data": { - "source": "iana", - "compressible": false - }, - "multipart/header-set": { - "source": "iana" - }, - "multipart/mixed": { - "source": "iana", - "compressible": false - }, - "multipart/parallel": { - "source": "iana" - }, - "multipart/related": { - "source": "iana", - "compressible": false - }, - "multipart/report": { - "source": "iana" - }, - "multipart/signed": { - "source": "iana", - "compressible": false - }, - "multipart/vnd.bint.med-plus": { - "source": "iana" - }, - "multipart/voice-message": { - "source": "iana" - }, - "multipart/x-mixed-replace": { - "source": "iana" - }, - "text/1d-interleaved-parityfec": { - "source": "iana" - }, - "text/cache-manifest": { - "source": "iana", - "compressible": true, - "extensions": ["appcache","manifest"] - }, - "text/calendar": { - "source": "iana", - "extensions": ["ics","ifb"] - }, - "text/calender": { - "compressible": true - }, - "text/cmd": { - "compressible": true - }, - "text/coffeescript": { - "extensions": ["coffee","litcoffee"] - }, - "text/css": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["css"] - }, - "text/csv": { - "source": "iana", - "compressible": true, - "extensions": ["csv"] - }, - "text/csv-schema": { - "source": "iana" - }, - "text/directory": { - "source": "iana" - }, - "text/dns": { - "source": "iana" - }, - "text/ecmascript": { - "source": "iana" - }, - "text/encaprtp": { - "source": "iana" - }, - "text/enriched": { - "source": "iana" - }, - "text/fwdred": { - "source": "iana" - }, - "text/grammar-ref-list": { - "source": "iana" - }, - "text/hjson": { - "extensions": ["hjson"] - }, - "text/html": { - "source": "iana", - "compressible": true, - "extensions": ["html","htm","shtml"] - }, - "text/jade": { - "extensions": ["jade"] - }, - "text/javascript": { - "source": "iana", - "compressible": true - }, - "text/jcr-cnd": { - "source": "iana" - }, - "text/jsx": { - "compressible": true, - "extensions": ["jsx"] - }, - "text/less": { - "extensions": ["less"] - }, - "text/markdown": { - "source": "iana", - "compressible": true, - "extensions": ["markdown","md"] - }, - "text/mathml": { - "source": "nginx", - "extensions": ["mml"] - }, - "text/mizar": { - "source": "iana" - }, - "text/n3": { - "source": "iana", - "compressible": true, - "extensions": ["n3"] - }, - "text/parameters": { - "source": "iana" - }, - "text/parityfec": { - "source": "iana" - }, - "text/plain": { - "source": "iana", - "compressible": true, - "extensions": ["txt","text","conf","def","list","log","in","ini"] - }, - "text/provenance-notation": { - "source": "iana" - }, - "text/prs.fallenstein.rst": { - "source": "iana" - }, - "text/prs.lines.tag": { - "source": "iana", - "extensions": ["dsc"] - }, - "text/prs.prop.logic": { - "source": "iana" - }, - "text/raptorfec": { - "source": "iana" - }, - "text/red": { - "source": "iana" - }, - "text/rfc822-headers": { - "source": "iana" - }, - "text/richtext": { - "source": "iana", - "compressible": true, - "extensions": ["rtx"] - }, - "text/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "text/rtp-enc-aescm128": { - "source": "iana" - }, - "text/rtploopback": { - "source": "iana" - }, - "text/rtx": { - "source": "iana" - }, - "text/sgml": { - "source": "iana", - "extensions": ["sgml","sgm"] - }, - "text/slim": { - "extensions": ["slim","slm"] - }, - "text/strings": { - "source": "iana" - }, - "text/stylus": { - "extensions": ["stylus","styl"] - }, - "text/t140": { - "source": "iana" - }, - "text/tab-separated-values": { - "source": "iana", - "compressible": true, - "extensions": ["tsv"] - }, - "text/troff": { - "source": "iana", - "extensions": ["t","tr","roff","man","me","ms"] - }, - "text/turtle": { - "source": "iana", - "extensions": ["ttl"] - }, - "text/ulpfec": { - "source": "iana" - }, - "text/uri-list": { - "source": "iana", - "compressible": true, - "extensions": ["uri","uris","urls"] - }, - "text/vcard": { - "source": "iana", - "compressible": true, - "extensions": ["vcard"] - }, - "text/vnd.a": { - "source": "iana" - }, - "text/vnd.abc": { - "source": "iana" - }, - "text/vnd.ascii-art": { - "source": "iana" - }, - "text/vnd.curl": { - "source": "iana", - "extensions": ["curl"] - }, - "text/vnd.curl.dcurl": { - "source": "apache", - "extensions": ["dcurl"] - }, - "text/vnd.curl.mcurl": { - "source": "apache", - "extensions": ["mcurl"] - }, - "text/vnd.curl.scurl": { - "source": "apache", - "extensions": ["scurl"] - }, - "text/vnd.debian.copyright": { - "source": "iana" - }, - "text/vnd.dmclientscript": { - "source": "iana" - }, - "text/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "text/vnd.esmertec.theme-descriptor": { - "source": "iana" - }, - "text/vnd.fly": { - "source": "iana", - "extensions": ["fly"] - }, - "text/vnd.fmi.flexstor": { - "source": "iana", - "extensions": ["flx"] - }, - "text/vnd.graphviz": { - "source": "iana", - "extensions": ["gv"] - }, - "text/vnd.in3d.3dml": { - "source": "iana", - "extensions": ["3dml"] - }, - "text/vnd.in3d.spot": { - "source": "iana", - "extensions": ["spot"] - }, - "text/vnd.iptc.newsml": { - "source": "iana" - }, - "text/vnd.iptc.nitf": { - "source": "iana" - }, - "text/vnd.latex-z": { - "source": "iana" - }, - "text/vnd.motorola.reflex": { - "source": "iana" - }, - "text/vnd.ms-mediapackage": { - "source": "iana" - }, - "text/vnd.net2phone.commcenter.command": { - "source": "iana" - }, - "text/vnd.radisys.msml-basic-layout": { - "source": "iana" - }, - "text/vnd.si.uricatalogue": { - "source": "iana" - }, - "text/vnd.sun.j2me.app-descriptor": { - "source": "iana", - "extensions": ["jad"] - }, - "text/vnd.trolltech.linguist": { - "source": "iana" - }, - "text/vnd.wap.si": { - "source": "iana" - }, - "text/vnd.wap.sl": { - "source": "iana" - }, - "text/vnd.wap.wml": { - "source": "iana", - "extensions": ["wml"] - }, - "text/vnd.wap.wmlscript": { - "source": "iana", - "extensions": ["wmls"] - }, - "text/vtt": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["vtt"] - }, - "text/x-asm": { - "source": "apache", - "extensions": ["s","asm"] - }, - "text/x-c": { - "source": "apache", - "extensions": ["c","cc","cxx","cpp","h","hh","dic"] - }, - "text/x-component": { - "source": "nginx", - "extensions": ["htc"] - }, - "text/x-fortran": { - "source": "apache", - "extensions": ["f","for","f77","f90"] - }, - "text/x-gwt-rpc": { - "compressible": true - }, - "text/x-handlebars-template": { - "extensions": ["hbs"] - }, - "text/x-java-source": { - "source": "apache", - "extensions": ["java"] - }, - "text/x-jquery-tmpl": { - "compressible": true - }, - "text/x-lua": { - "extensions": ["lua"] - }, - "text/x-markdown": { - "compressible": true, - "extensions": ["mkd"] - }, - "text/x-nfo": { - "source": "apache", - "extensions": ["nfo"] - }, - "text/x-opml": { - "source": "apache", - "extensions": ["opml"] - }, - "text/x-org": { - "compressible": true, - "extensions": ["org"] - }, - "text/x-pascal": { - "source": "apache", - "extensions": ["p","pas"] - }, - "text/x-processing": { - "compressible": true, - "extensions": ["pde"] - }, - "text/x-sass": { - "extensions": ["sass"] - }, - "text/x-scss": { - "extensions": ["scss"] - }, - "text/x-setext": { - "source": "apache", - "extensions": ["etx"] - }, - "text/x-sfv": { - "source": "apache", - "extensions": ["sfv"] - }, - "text/x-suse-ymp": { - "compressible": true, - "extensions": ["ymp"] - }, - "text/x-uuencode": { - "source": "apache", - "extensions": ["uu"] - }, - "text/x-vcalendar": { - "source": "apache", - "extensions": ["vcs"] - }, - "text/x-vcard": { - "source": "apache", - "extensions": ["vcf"] - }, - "text/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml"] - }, - "text/xml-external-parsed-entity": { - "source": "iana" - }, - "text/yaml": { - "extensions": ["yaml","yml"] - }, - "video/1d-interleaved-parityfec": { - "source": "iana" - }, - "video/3gpp": { - "source": "iana", - "extensions": ["3gp","3gpp"] - }, - "video/3gpp-tt": { - "source": "iana" - }, - "video/3gpp2": { - "source": "iana", - "extensions": ["3g2"] - }, - "video/bmpeg": { - "source": "iana" - }, - "video/bt656": { - "source": "iana" - }, - "video/celb": { - "source": "iana" - }, - "video/dv": { - "source": "iana" - }, - "video/encaprtp": { - "source": "iana" - }, - "video/h261": { - "source": "iana", - "extensions": ["h261"] - }, - "video/h263": { - "source": "iana", - "extensions": ["h263"] - }, - "video/h263-1998": { - "source": "iana" - }, - "video/h263-2000": { - "source": "iana" - }, - "video/h264": { - "source": "iana", - "extensions": ["h264"] - }, - "video/h264-rcdo": { - "source": "iana" - }, - "video/h264-svc": { - "source": "iana" - }, - "video/h265": { - "source": "iana" - }, - "video/iso.segment": { - "source": "iana" - }, - "video/jpeg": { - "source": "iana", - "extensions": ["jpgv"] - }, - "video/jpeg2000": { - "source": "iana" - }, - "video/jpm": { - "source": "apache", - "extensions": ["jpm","jpgm"] - }, - "video/mj2": { - "source": "iana", - "extensions": ["mj2","mjp2"] - }, - "video/mp1s": { - "source": "iana" - }, - "video/mp2p": { - "source": "iana" - }, - "video/mp2t": { - "source": "iana", - "extensions": ["ts"] - }, - "video/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["mp4","mp4v","mpg4"] - }, - "video/mp4v-es": { - "source": "iana" - }, - "video/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpeg","mpg","mpe","m1v","m2v"] - }, - "video/mpeg4-generic": { - "source": "iana" - }, - "video/mpv": { - "source": "iana" - }, - "video/nv": { - "source": "iana" - }, - "video/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogv"] - }, - "video/parityfec": { - "source": "iana" - }, - "video/pointer": { - "source": "iana" - }, - "video/quicktime": { - "source": "iana", - "compressible": false, - "extensions": ["qt","mov"] - }, - "video/raptorfec": { - "source": "iana" - }, - "video/raw": { - "source": "iana" - }, - "video/rtp-enc-aescm128": { - "source": "iana" - }, - "video/rtploopback": { - "source": "iana" - }, - "video/rtx": { - "source": "iana" - }, - "video/smpte292m": { - "source": "iana" - }, - "video/ulpfec": { - "source": "iana" - }, - "video/vc1": { - "source": "iana" - }, - "video/vnd.cctv": { - "source": "iana" - }, - "video/vnd.dece.hd": { - "source": "iana", - "extensions": ["uvh","uvvh"] - }, - "video/vnd.dece.mobile": { - "source": "iana", - "extensions": ["uvm","uvvm"] - }, - "video/vnd.dece.mp4": { - "source": "iana" - }, - "video/vnd.dece.pd": { - "source": "iana", - "extensions": ["uvp","uvvp"] - }, - "video/vnd.dece.sd": { - "source": "iana", - "extensions": ["uvs","uvvs"] - }, - "video/vnd.dece.video": { - "source": "iana", - "extensions": ["uvv","uvvv"] - }, - "video/vnd.directv.mpeg": { - "source": "iana" - }, - "video/vnd.directv.mpeg-tts": { - "source": "iana" - }, - "video/vnd.dlna.mpeg-tts": { - "source": "iana" - }, - "video/vnd.dvb.file": { - "source": "iana", - "extensions": ["dvb"] - }, - "video/vnd.fvt": { - "source": "iana", - "extensions": ["fvt"] - }, - "video/vnd.hns.video": { - "source": "iana" - }, - "video/vnd.iptvforum.1dparityfec-1010": { - "source": "iana" - }, - "video/vnd.iptvforum.1dparityfec-2005": { - "source": "iana" - }, - "video/vnd.iptvforum.2dparityfec-1010": { - "source": "iana" - }, - "video/vnd.iptvforum.2dparityfec-2005": { - "source": "iana" - }, - "video/vnd.iptvforum.ttsavc": { - "source": "iana" - }, - "video/vnd.iptvforum.ttsmpeg2": { - "source": "iana" - }, - "video/vnd.motorola.video": { - "source": "iana" - }, - "video/vnd.motorola.videop": { - "source": "iana" - }, - "video/vnd.mpegurl": { - "source": "iana", - "extensions": ["mxu","m4u"] - }, - "video/vnd.ms-playready.media.pyv": { - "source": "iana", - "extensions": ["pyv"] - }, - "video/vnd.nokia.interleaved-multimedia": { - "source": "iana" - }, - "video/vnd.nokia.videovoip": { - "source": "iana" - }, - "video/vnd.objectvideo": { - "source": "iana" - }, - "video/vnd.radgamettools.bink": { - "source": "iana" - }, - "video/vnd.radgamettools.smacker": { - "source": "iana" - }, - "video/vnd.sealed.mpeg1": { - "source": "iana" - }, - "video/vnd.sealed.mpeg4": { - "source": "iana" - }, - "video/vnd.sealed.swf": { - "source": "iana" - }, - "video/vnd.sealedmedia.softseal.mov": { - "source": "iana" - }, - "video/vnd.uvvu.mp4": { - "source": "iana", - "extensions": ["uvu","uvvu"] - }, - "video/vnd.vivo": { - "source": "iana", - "extensions": ["viv"] - }, - "video/vp8": { - "source": "iana" - }, - "video/webm": { - "source": "apache", - "compressible": false, - "extensions": ["webm"] - }, - "video/x-f4v": { - "source": "apache", - "extensions": ["f4v"] - }, - "video/x-fli": { - "source": "apache", - "extensions": ["fli"] - }, - "video/x-flv": { - "source": "apache", - "compressible": false, - "extensions": ["flv"] - }, - "video/x-m4v": { - "source": "apache", - "extensions": ["m4v"] - }, - "video/x-matroska": { - "source": "apache", - "compressible": false, - "extensions": ["mkv","mk3d","mks"] - }, - "video/x-mng": { - "source": "apache", - "extensions": ["mng"] - }, - "video/x-ms-asf": { - "source": "apache", - "extensions": ["asf","asx"] - }, - "video/x-ms-vob": { - "source": "apache", - "extensions": ["vob"] - }, - "video/x-ms-wm": { - "source": "apache", - "extensions": ["wm"] - }, - "video/x-ms-wmv": { - "source": "apache", - "compressible": false, - "extensions": ["wmv"] - }, - "video/x-ms-wmx": { - "source": "apache", - "extensions": ["wmx"] - }, - "video/x-ms-wvx": { - "source": "apache", - "extensions": ["wvx"] - }, - "video/x-msvideo": { - "source": "apache", - "extensions": ["avi"] - }, - "video/x-sgi-movie": { - "source": "apache", - "extensions": ["movie"] - }, - "video/x-smv": { - "source": "apache", - "extensions": ["smv"] - }, - "x-conference/x-cooltalk": { - "source": "apache", - "extensions": ["ice"] - }, - "x-shader/x-fragment": { - "compressible": true - }, - "x-shader/x-vertex": { - "compressible": true - } -} - -},{}],120:[function(require,module,exports){ -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = require('./db.json') - -},{"./db.json":119}],121:[function(require,module,exports){ -/*! - * mime-types - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var db = require('mime-db') -var extname = require('path').extname - -/** - * Module variables. - * @private - */ - -var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/ -var TEXT_TYPE_REGEXP = /^text\//i - -/** - * Module exports. - * @public - */ - -exports.charset = charset -exports.charsets = { lookup: charset } -exports.contentType = contentType -exports.extension = extension -exports.extensions = Object.create(null) -exports.lookup = lookup -exports.types = Object.create(null) - -// Populate the extensions/types maps -populateMaps(exports.extensions, exports.types) - -/** - * Get the default charset for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function charset (type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = EXTRACT_TYPE_REGEXP.exec(type) - var mime = match && db[match[1].toLowerCase()] - - if (mime && mime.charset) { - return mime.charset - } - - // default text/* to utf-8 - if (match && TEXT_TYPE_REGEXP.test(match[1])) { - return 'UTF-8' - } - - return false -} - -/** - * Create a full Content-Type header given a MIME type or extension. - * - * @param {string} str - * @return {boolean|string} - */ - -function contentType (str) { - // TODO: should this even be in this module? - if (!str || typeof str !== 'string') { - return false - } - - var mime = str.indexOf('/') === -1 - ? exports.lookup(str) - : str - - if (!mime) { - return false - } - - // TODO: use content-type or other module - if (mime.indexOf('charset') === -1) { - var charset = exports.charset(mime) - if (charset) mime += '; charset=' + charset.toLowerCase() - } - - return mime -} - -/** - * Get the default extension for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function extension (type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = EXTRACT_TYPE_REGEXP.exec(type) - - // get extensions - var exts = match && exports.extensions[match[1].toLowerCase()] - - if (!exts || !exts.length) { - return false - } - - return exts[0] -} - -/** - * Lookup the MIME type for a file path/extension. - * - * @param {string} path - * @return {boolean|string} - */ - -function lookup (path) { - if (!path || typeof path !== 'string') { - return false - } - - // get the extension ("ext" or ".ext" or full path) - var extension = extname('x.' + path) - .toLowerCase() - .substr(1) - - if (!extension) { - return false - } - - return exports.types[extension] || false -} - -/** - * Populate the extensions and types maps. - * @private - */ - -function populateMaps (extensions, types) { - // source preference (least -> most) - var preference = ['nginx', 'apache', undefined, 'iana'] - - Object.keys(db).forEach(function forEachMimeType (type) { - var mime = db[type] - var exts = mime.extensions - - if (!exts || !exts.length) { - return - } - - // mime -> extensions - extensions[type] = exts - - // extension -> mime - for (var i = 0; i < exts.length; i++) { - var extension = exts[i] - - if (types[extension]) { - var from = preference.indexOf(db[types[extension]].source) - var to = preference.indexOf(mime.source) - - if (types[extension] !== 'application/octet-stream' && - (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) { - // skip the remapping - continue - } - } - - // set the extension -> mime - types[extension] = type - } - }) -} - -},{"mime-db":120,"path":undefined}],122:[function(require,module,exports){ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rsa (key, body) { - return crypto.createSign("RSA-SHA1").update(body).sign(key, 'base64'); -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace(/!/g,'%21') - .replace(/\*/g,'%2A') - .replace(/\(/g,'%28') - .replace(/\)/g,'%29') - .replace(/'/g,'%27') - ; -} - -// Maps object to bi-dimensional array -// Converts { foo: 'A', bar: [ 'b', 'B' ]} to -// [ ['foo', 'A'], ['bar', 'b'], ['bar', 'B'] ] -function map (obj) { - var key, val, arr = [] - for (key in obj) { - val = obj[key] - if (Array.isArray(val)) - for (var i = 0; i < val.length; i++) - arr.push([key, val[i]]) - else if (typeof val === "object") - for (var prop in val) - arr.push([key + '[' + prop + ']', val[prop]]); - else - arr.push([key, val]) - } - return arr -} - -// Compare function for sort -function compare (a, b) { - return a > b ? 1 : a < b ? -1 : 0 -} - -function generateBase (httpMethod, base_uri, params) { - // adapted from https://dev.twitter.com/docs/auth/oauth and - // https://dev.twitter.com/docs/auth/creating-signature - - // Parameter normalization - // http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2 - var normalized = map(params) - // 1. First, the name and value of each parameter are encoded - .map(function (p) { - return [ rfc3986(p[0]), rfc3986(p[1] || '') ] - }) - // 2. The parameters are sorted by name, using ascending byte value - // ordering. If two or more parameters share the same name, they - // are sorted by their value. - .sort(function (a, b) { - return compare(a[0], b[0]) || compare(a[1], b[1]) - }) - // 3. The name of each parameter is concatenated to its corresponding - // value using an "=" character (ASCII code 61) as a separator, even - // if the value is empty. - .map(function (p) { return p.join('=') }) - // 4. The sorted name/value pairs are concatenated together into a - // single string by using an "&" character (ASCII code 38) as - // separator. - .join('&') - - var base = [ - rfc3986(httpMethod ? httpMethod.toUpperCase() : 'GET'), - rfc3986(base_uri), - rfc3986(normalized) - ].join('&') - - return base -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { - var base = generateBase(httpMethod, base_uri, params) - var key = [ - consumer_secret || '', - token_secret || '' - ].map(rfc3986).join('&') - - return sha1(key, base) -} - -function rsasign (httpMethod, base_uri, params, private_key, token_secret) { - var base = generateBase(httpMethod, base_uri, params) - var key = private_key || '' - - return rsa(key, base) -} - -function plaintext (consumer_secret, token_secret) { - var key = [ - consumer_secret || '', - token_secret || '' - ].map(rfc3986).join('&') - - return key -} - -function sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) { - var method - var skipArgs = 1 - - switch (signMethod) { - case 'RSA-SHA1': - method = rsasign - break - case 'HMAC-SHA1': - method = hmacsign - break - case 'PLAINTEXT': - method = plaintext - skipArgs = 4 - break - default: - throw new Error("Signature method not supported: " + signMethod) - } - - return method.apply(null, [].slice.call(arguments, skipArgs)) -} - -exports.hmacsign = hmacsign -exports.rsasign = rsasign -exports.plaintext = plaintext -exports.sign = sign -exports.rfc3986 = rfc3986 -exports.generateBase = generateBase - - -},{"crypto":undefined,"querystring":undefined}],123:[function(require,module,exports){ -// Generated by CoffeeScript 1.12.2 -(function() { - var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime; - - if ((typeof performance !== "undefined" && performance !== null) && performance.now) { - module.exports = function() { - return performance.now(); - }; - } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) { - module.exports = function() { - return (getNanoSeconds() - nodeLoadTime) / 1e6; - }; - hrtime = process.hrtime; - getNanoSeconds = function() { - var hr; - hr = hrtime(); - return hr[0] * 1e9 + hr[1]; - }; - moduleLoadTime = getNanoSeconds(); - upTime = process.uptime() * 1e9; - nodeLoadTime = moduleLoadTime - upTime; - } else if (Date.now) { - module.exports = function() { - return Date.now() - loadTime; - }; - loadTime = Date.now(); - } else { - module.exports = function() { - return new Date().getTime() - loadTime; - }; - loadTime = new Date().getTime(); - } - -}).call(this); - - - -},{}],124:[function(require,module,exports){ -module.exports = require('./lib'); - -},{"./lib":125}],125:[function(require,module,exports){ -// Load modules - -var Stringify = require('./stringify'); -var Parse = require('./parse'); - - -// Declare internals - -var internals = {}; - - -module.exports = { - stringify: Stringify, - parse: Parse -}; - -},{"./parse":126,"./stringify":127}],126:[function(require,module,exports){ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - depth: 5, - arrayLimit: 20, - parametersLimit: 1000 -}; - - -internals.parseValues = function (str, delimiter) { - - delimiter = typeof delimiter === 'undefined' ? internals.delimiter : delimiter; - - var obj = {}; - var parts = str.split(delimiter, internals.parametersLimit); - - for (var i = 0, il = parts.length; i < il; ++i) { - var part = parts[i]; - var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; - - if (pos === -1) { - obj[Utils.decode(part)] = ''; - } - else { - var key = Utils.decode(part.slice(0, pos)); - var val = Utils.decode(part.slice(pos + 1)); - - if (!obj[key]) { - obj[key] = val; - } - else { - obj[key] = [].concat(obj[key]).concat(val); - } - } - } - - return obj; -}; - - -internals.parseObject = function (chain, val) { - - if (!chain.length) { - return val; - } - - var root = chain.shift(); - - var obj = {}; - if (root === '[]') { - obj = []; - obj = obj.concat(internals.parseObject(chain, val)); - } - else { - var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; - var index = parseInt(cleanRoot, 10); - if (!isNaN(index) && - root !== cleanRoot && - index <= internals.arrayLimit) { - - obj = []; - obj[index] = internals.parseObject(chain, val); - } - else { - obj[cleanRoot] = internals.parseObject(chain, val); - } - } - - return obj; -}; - - -internals.parseKeys = function (key, val, depth) { - - if (!key) { - return; - } - - // The regex chunks - - var parent = /^([^\[\]]*)/; - var child = /(\[[^\[\]]*\])/g; - - // Get the parent - - var segment = parent.exec(key); - - // Don't allow them to overwrite object prototype properties - - if (Object.prototype.hasOwnProperty(segment[1])) { - return; - } - - // Stash the parent if it exists - - var keys = []; - if (segment[1]) { - keys.push(segment[1]); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < depth) { - - ++i; - if (!Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) { - keys.push(segment[1]); - } - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return internals.parseObject(keys, val); -}; - - -module.exports = function (str, depth, delimiter) { - - if (str === '' || - str === null || - typeof str === 'undefined') { - - return {}; - } - - if (typeof depth !== 'number') { - delimiter = depth; - depth = internals.depth; - } - - var tempObj = typeof str === 'string' ? internals.parseValues(str, delimiter) : Utils.clone(str); - var obj = {}; - - // Iterate over the keys and setup the new object - // - for (var key in tempObj) { - if (tempObj.hasOwnProperty(key)) { - var newObj = internals.parseKeys(key, tempObj[key], depth); - obj = Utils.merge(obj, newObj); - } - } - - return Utils.compact(obj); -}; - - - -},{"./utils":128}],127:[function(require,module,exports){ -// Load modules - - -// Declare internals - -var internals = { - delimiter: '&' -}; - - -internals.stringify = function (obj, prefix) { - - if (Buffer.isBuffer(obj)) { - obj = obj.toString(); - } - else if (obj instanceof Date) { - obj = obj.toISOString(); - } - else if (obj === null) { - obj = ''; - } - - if (typeof obj === 'string' || - typeof obj === 'number' || - typeof obj === 'boolean') { - - return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)]; - } - - var values = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']')); - } - } - - return values; -}; - - -module.exports = function (obj, delimiter) { - - delimiter = typeof delimiter === 'undefined' ? internals.delimiter : delimiter; - - var keys = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - keys = keys.concat(internals.stringify(obj[key], key)); - } - } - - return keys.join(delimiter); -}; - -},{}],128:[function(require,module,exports){ -// Load modules - - -// Declare internals - -var internals = {}; - - -exports.arrayToObject = function (source) { - - var obj = {}; - for (var i = 0, il = source.length; i < il; ++i) { - if (typeof source[i] !== 'undefined') { - - obj[i] = source[i]; - } - } - - return obj; -}; - - -exports.clone = function (source) { - - if (typeof source !== 'object' || - source === null) { - - return source; - } - - if (Buffer.isBuffer(source)) { - return source.toString(); - } - - var obj = Array.isArray(source) ? [] : {}; - for (var i in source) { - if (source.hasOwnProperty(i)) { - obj[i] = exports.clone(source[i]); - } - } - - return obj; -}; - - -exports.merge = function (target, source) { - - if (!source) { - return target; - } - - var obj = exports.clone(target); - - if (Array.isArray(source)) { - for (var i = 0, il = source.length; i < il; ++i) { - if (typeof source[i] !== 'undefined') { - if (typeof obj[i] === 'object') { - obj[i] = exports.merge(obj[i], source[i]); - } - else { - obj[i] = source[i]; - } - } - } - - return obj; - } - - if (Array.isArray(obj)) { - obj = exports.arrayToObject(obj); - } - - var keys = Object.keys(source); - for (var k = 0, kl = keys.length; k < kl; ++k) { - var key = keys[k]; - var value = source[key]; - - if (value && - typeof value === 'object') { - - if (!obj[key]) { - obj[key] = exports.clone(value); - } - else { - obj[key] = exports.merge(obj[key], value); - } - } - else { - obj[key] = value; - } - } - - return obj; -}; - - -exports.decode = function (str) { - - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - - -exports.compact = function (obj) { - - if (typeof obj !== 'object') { - return obj; - } - - var compacted = {}; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - if (Array.isArray(obj[key])) { - compacted[key] = []; - - for (var i = 0, l = obj[key].length; i < l; i++) { - if (typeof obj[key][i] !== 'undefined') { - compacted[key].push(obj[key][i]); - } - } - } - else { - compacted[key] = exports.compact(obj[key]); - } - } - } - - return compacted; -}; - -},{}],129:[function(require,module,exports){ -(function (__dirname){ -/* - * readlineSync - * https://github.com/anseki/readline-sync - * - * Copyright (c) 2018 anseki - * Licensed under the MIT license. - */ - -'use strict'; - -var - IS_WIN = process.platform === 'win32', - - ALGORITHM_CIPHER = 'aes-256-cbc', - ALGORITHM_HASH = 'sha256', - DEFAULT_ERR_MSG = 'The current environment doesn\'t support interactive reading from TTY.', - - fs = require('fs'), - TTY = process.binding('tty_wrap').TTY, - childProc = require('child_process'), - pathUtil = require('path'), - - defaultOptions = { - /* eslint-disable key-spacing */ - prompt: '> ', - hideEchoBack: false, - mask: '*', - limit: [], - limitMessage: 'Input another, please.$<( [)limit(])>', - defaultInput: '', - trueValue: [], - falseValue: [], - caseSensitive: false, - keepWhitespace: false, - encoding: 'utf8', - bufferSize: 1024, - print: void 0, - history: true, - cd: false, - phContent: void 0, - preCheck: void 0 - /* eslint-enable key-spacing */ - }, - - fdR = 'none', fdW, ttyR, isRawMode = false, - extHostPath, extHostArgs, tempdir, salt = 0, - lastInput = '', inputHistory = [], rawInput, - _DBG_useExt = false, _DBG_checkOptions = false, _DBG_checkMethod = false; - -function getHostArgs(options) { - // Send any text to crazy Windows shell safely. - function encodeArg(arg) { - return arg.replace(/[^\w\u0080-\uFFFF]/g, function(chr) { - return '#' + chr.charCodeAt(0) + ';'; - }); - } - - return extHostArgs.concat((function(conf) { - var args = []; - Object.keys(conf).forEach(function(optionName) { - if (conf[optionName] === 'boolean') { - if (options[optionName]) { args.push('--' + optionName); } - } else if (conf[optionName] === 'string') { - if (options[optionName]) { - args.push('--' + optionName, encodeArg(options[optionName])); - } - } - }); - return args; - })({ - /* eslint-disable key-spacing */ - display: 'string', - displayOnly: 'boolean', - keyIn: 'boolean', - hideEchoBack: 'boolean', - mask: 'string', - limit: 'string', - caseSensitive: 'boolean' - /* eslint-enable key-spacing */ - })); -} - -// piping via files (for Node.js v0.10-) -function _execFileSync(options, execOptions) { - - function getTempfile(name) { - var filepath, suffix = '', fd; - tempdir = tempdir || require('os').tmpdir(); - - while (true) { - filepath = pathUtil.join(tempdir, name + suffix); - try { - fd = fs.openSync(filepath, 'wx'); - } catch (e) { - if (e.code === 'EEXIST') { - suffix++; - continue; - } else { - throw e; - } - } - fs.closeSync(fd); - break; - } - return filepath; - } - - var hostArgs, shellPath, shellArgs, res = {}, exitCode, extMessage, - pathStdout = getTempfile('readline-sync.stdout'), - pathStderr = getTempfile('readline-sync.stderr'), - pathExit = getTempfile('readline-sync.exit'), - pathDone = getTempfile('readline-sync.done'), - crypto = require('crypto'), shasum, decipher, password; - - shasum = crypto.createHash(ALGORITHM_HASH); - shasum.update('' + process.pid + (salt++) + Math.random()); - password = shasum.digest('hex'); - decipher = crypto.createDecipher(ALGORITHM_CIPHER, password); - - hostArgs = getHostArgs(options); - if (IS_WIN) { - shellPath = process.env.ComSpec || 'cmd.exe'; - process.env.Q = '"'; // The quote (") that isn't escaped. - // `()` for ignore space by echo - shellArgs = ['/V:ON', '/S', '/C', - '(%Q%' + shellPath + '%Q% /V:ON /S /C %Q%' + /* ESLint bug? */ // eslint-disable-line no-path-concat - '%Q%' + extHostPath + '%Q%' + - hostArgs.map(function(arg) { return ' %Q%' + arg + '%Q%'; }).join('') + - ' & (echo !ERRORLEVEL!)>%Q%' + pathExit + '%Q%%Q%) 2>%Q%' + pathStderr + '%Q%' + - ' |%Q%' + process.execPath + '%Q% %Q%' + __dirname + '\\encrypt.js%Q%' + - ' %Q%' + ALGORITHM_CIPHER + '%Q% %Q%' + password + '%Q%' + - ' >%Q%' + pathStdout + '%Q%' + - ' & (echo 1)>%Q%' + pathDone + '%Q%']; - } else { - shellPath = '/bin/sh'; - shellArgs = ['-c', - // Use `()`, not `{}` for `-c` (text param) - '("' + extHostPath + '"' + /* ESLint bug? */ // eslint-disable-line no-path-concat - hostArgs.map(function(arg) { return " '" + arg.replace(/'/g, "'\\''") + "'"; }).join('') + - '; echo $?>"' + pathExit + '") 2>"' + pathStderr + '"' + - ' |"' + process.execPath + '" "' + __dirname + '/encrypt.js"' + - ' "' + ALGORITHM_CIPHER + '" "' + password + '"' + - ' >"' + pathStdout + '"' + - '; echo 1 >"' + pathDone + '"']; - } - if (_DBG_checkMethod) { _DBG_checkMethod('_execFileSync', hostArgs); } - try { - childProc.spawn(shellPath, shellArgs, execOptions); - } catch (e) { - res.error = new Error(e.message); - res.error.method = '_execFileSync - spawn'; - res.error.program = shellPath; - res.error.args = shellArgs; - } - - while (fs.readFileSync(pathDone, {encoding: options.encoding}).trim() !== '1') {} // eslint-disable-line no-empty - if ((exitCode = - fs.readFileSync(pathExit, {encoding: options.encoding}).trim()) === '0') { - res.input = - decipher.update(fs.readFileSync(pathStdout, {encoding: 'binary'}), - 'hex', options.encoding) + - decipher.final(options.encoding); - } else { - extMessage = fs.readFileSync(pathStderr, {encoding: options.encoding}).trim(); - res.error = new Error(DEFAULT_ERR_MSG + (extMessage ? '\n' + extMessage : '')); - res.error.method = '_execFileSync'; - res.error.program = shellPath; - res.error.args = shellArgs; - res.error.extMessage = extMessage; - res.error.exitCode = +exitCode; - } - - fs.unlinkSync(pathStdout); - fs.unlinkSync(pathStderr); - fs.unlinkSync(pathExit); - fs.unlinkSync(pathDone); - - return res; -} - -function readlineExt(options) { - var hostArgs, res = {}, extMessage, - execOptions = {env: process.env, encoding: options.encoding}; - - if (!extHostPath) { - if (IS_WIN) { - if (process.env.PSModulePath) { // Windows PowerShell - extHostPath = 'powershell.exe'; - extHostArgs = ['-ExecutionPolicy', 'Bypass', '-File', __dirname + '\\read.ps1']; // eslint-disable-line no-path-concat - } else { // Windows Script Host - extHostPath = 'cscript.exe'; - extHostArgs = ['//nologo', __dirname + '\\read.cs.js']; // eslint-disable-line no-path-concat - } - } else { - extHostPath = '/bin/sh'; - extHostArgs = [__dirname + '/read.sh']; // eslint-disable-line no-path-concat - } - } - if (IS_WIN && !process.env.PSModulePath) { // Windows Script Host - // ScriptPW (Win XP and Server2003) needs TTY stream as STDIN. - // In this case, If STDIN isn't TTY, an error is thrown. - execOptions.stdio = [process.stdin]; - } - - if (childProc.execFileSync) { - hostArgs = getHostArgs(options); - if (_DBG_checkMethod) { _DBG_checkMethod('execFileSync', hostArgs); } - try { - res.input = childProc.execFileSync(extHostPath, hostArgs, execOptions); - } catch (e) { // non-zero exit code - extMessage = e.stderr ? (e.stderr + '').trim() : ''; - res.error = new Error(DEFAULT_ERR_MSG + (extMessage ? '\n' + extMessage : '')); - res.error.method = 'execFileSync'; - res.error.program = extHostPath; - res.error.args = hostArgs; - res.error.extMessage = extMessage; - res.error.exitCode = e.status; - res.error.code = e.code; - res.error.signal = e.signal; - } - } else { - res = _execFileSync(options, execOptions); - } - if (!res.error) { - res.input = res.input.replace(/^\s*'|'\s*$/g, ''); - options.display = ''; - } - - return res; -} - -/* - display: string - displayOnly: boolean - keyIn: boolean - hideEchoBack: boolean - mask: string - limit: string (pattern) - caseSensitive: boolean - keepWhitespace: boolean - encoding, bufferSize, print -*/ -function _readlineSync(options) { - var input = '', displaySave = options.display, - silent = !options.display && - options.keyIn && options.hideEchoBack && !options.mask; - - function tryExt() { - var res = readlineExt(options); - if (res.error) { throw res.error; } - return res.input; - } - - if (_DBG_checkOptions) { _DBG_checkOptions(options); } - - (function() { // open TTY - var fsB, constants, verNum; - - function getFsB() { - if (!fsB) { - fsB = process.binding('fs'); // For raw device path - constants = process.binding('constants'); - } - return fsB; - } - - if (typeof fdR !== 'string') { return; } - fdR = null; - - if (IS_WIN) { - // iojs-v2.3.2+ input stream can't read first line. (#18) - // ** Don't get process.stdin before check! ** - // Fixed v5.1.0 - // Fixed v4.2.4 - // It regressed again in v5.6.0, it is fixed in v6.2.0. - verNum = (function(ver) { // getVerNum - var nums = ver.replace(/^\D+/, '').split('.'); - var verNum = 0; - if ((nums[0] = +nums[0])) { verNum += nums[0] * 10000; } - if ((nums[1] = +nums[1])) { verNum += nums[1] * 100; } - if ((nums[2] = +nums[2])) { verNum += nums[2]; } - return verNum; - })(process.version); - if (!(verNum >= 20302 && verNum < 40204 || verNum >= 50000 && verNum < 50100 || verNum >= 50600 && verNum < 60200) && - process.stdin.isTTY) { - process.stdin.pause(); - fdR = process.stdin.fd; - ttyR = process.stdin._handle; - } else { - try { - // The stream by fs.openSync('\\\\.\\CON', 'r') can't switch to raw mode. - // 'CONIN$' might fail on XP, 2000, 7 (x86). - fdR = getFsB().open('CONIN$', constants.O_RDWR, parseInt('0666', 8)); - ttyR = new TTY(fdR, true); - } catch (e) { /* ignore */ } - } - - if (process.stdout.isTTY) { - fdW = process.stdout.fd; - } else { - try { - fdW = fs.openSync('\\\\.\\CON', 'w'); - } catch (e) { /* ignore */ } - if (typeof fdW !== 'number') { // Retry - try { - fdW = getFsB().open('CONOUT$', constants.O_RDWR, parseInt('0666', 8)); - } catch (e) { /* ignore */ } - } - } - - } else { - if (process.stdin.isTTY) { - process.stdin.pause(); - try { - fdR = fs.openSync('/dev/tty', 'r'); // device file, not process.stdin - ttyR = process.stdin._handle; - } catch (e) { /* ignore */ } - } else { - // Node.js v0.12 read() fails. - try { - fdR = fs.openSync('/dev/tty', 'r'); - ttyR = new TTY(fdR, false); - } catch (e) { /* ignore */ } - } - - if (process.stdout.isTTY) { - fdW = process.stdout.fd; - } else { - try { - fdW = fs.openSync('/dev/tty', 'w'); - } catch (e) { /* ignore */ } - } - } - })(); - - (function() { // try read - var atEol, limit, - isCooked = !options.hideEchoBack && !options.keyIn, - buffer, reqSize, readSize, chunk, line; - rawInput = ''; - - // Node.js v0.10- returns an error if same mode is set. - function setRawMode(mode) { - if (mode === isRawMode) { return true; } - if (ttyR.setRawMode(mode) !== 0) { return false; } - isRawMode = mode; - return true; - } - - if (_DBG_useExt || !ttyR || - typeof fdW !== 'number' && (options.display || !isCooked)) { - input = tryExt(); - return; - } - - if (options.display) { - fs.writeSync(fdW, options.display); - options.display = ''; - } - if (options.displayOnly) { return; } - - if (!setRawMode(!isCooked)) { - input = tryExt(); - return; - } - - reqSize = options.keyIn ? 1 : options.bufferSize; - // Check `allocUnsafe` to make sure of the new API. - buffer = Buffer.allocUnsafe && Buffer.alloc ? Buffer.alloc(reqSize) : new Buffer(reqSize); - - if (options.keyIn && options.limit) { - limit = new RegExp('[^' + options.limit + ']', - 'g' + (options.caseSensitive ? '' : 'i')); - } - - while (true) { - readSize = 0; - try { - readSize = fs.readSync(fdR, buffer, 0, reqSize); - } catch (e) { - if (e.code !== 'EOF') { - setRawMode(false); - input += tryExt(); - return; - } - } - if (readSize > 0) { - chunk = buffer.toString(options.encoding, 0, readSize); - rawInput += chunk; - } else { - chunk = '\n'; - rawInput += String.fromCharCode(0); - } - - if (chunk && typeof (line = (chunk.match(/^(.*?)[\r\n]/) || [])[1]) === 'string') { - chunk = line; - atEol = true; - } - - // other ctrl-chars - // eslint-disable-next-line no-control-regex - if (chunk) { chunk = chunk.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ''); } - if (chunk && limit) { chunk = chunk.replace(limit, ''); } - - if (chunk) { - if (!isCooked) { - if (!options.hideEchoBack) { - fs.writeSync(fdW, chunk); - } else if (options.mask) { - fs.writeSync(fdW, (new Array(chunk.length + 1)).join(options.mask)); - } - } - input += chunk; - } - - if (!options.keyIn && atEol || - options.keyIn && input.length >= reqSize) { break; } - } - - if (!isCooked && !silent) { fs.writeSync(fdW, '\n'); } - setRawMode(false); - })(); - - if (options.print && !silent) { - options.print(displaySave + (options.displayOnly ? '' : - (options.hideEchoBack ? (new Array(input.length + 1)).join(options.mask) - : input) + '\n'), // must at least write '\n' - options.encoding); - } - - return options.displayOnly ? '' : - (lastInput = options.keepWhitespace || options.keyIn ? input : input.trim()); -} - -function flattenArray(array, validator) { - var flatArray = []; - function _flattenArray(array) { - if (array == null) { - return; - } else if (Array.isArray(array)) { - array.forEach(_flattenArray); - } else if (!validator || validator(array)) { - flatArray.push(array); - } - } - _flattenArray(array); - return flatArray; -} - -function escapePattern(pattern) { - return pattern.replace(/[\x00-\x7f]/g, // eslint-disable-line no-control-regex - function(s) { return '\\x' + ('00' + s.charCodeAt().toString(16)).substr(-2); }); -} - -// margeOptions(options1, options2 ... ) -// margeOptions(true, options1, options2 ... ) -// arg1=true : Start from defaultOptions and pick elements of that. -function margeOptions() { - var optionsList = Array.prototype.slice.call(arguments), - optionNames, fromDefault; - - if (optionsList.length && typeof optionsList[0] === 'boolean') { - fromDefault = optionsList.shift(); - if (fromDefault) { - optionNames = Object.keys(defaultOptions); - optionsList.unshift(defaultOptions); - } - } - - return optionsList.reduce(function(options, optionsPart) { - if (optionsPart == null) { return options; } - - // ======== DEPRECATED ======== - if (optionsPart.hasOwnProperty('noEchoBack') && - !optionsPart.hasOwnProperty('hideEchoBack')) { - optionsPart.hideEchoBack = optionsPart.noEchoBack; - delete optionsPart.noEchoBack; - } - if (optionsPart.hasOwnProperty('noTrim') && - !optionsPart.hasOwnProperty('keepWhitespace')) { - optionsPart.keepWhitespace = optionsPart.noTrim; - delete optionsPart.noTrim; - } - // ======== /DEPRECATED ======== - - if (!fromDefault) { optionNames = Object.keys(optionsPart); } - optionNames.forEach(function(optionName) { - var value; - if (!optionsPart.hasOwnProperty(optionName)) { return; } - value = optionsPart[optionName]; - switch (optionName) { - // _readlineSync <- * * -> defaultOptions - // ================ string - case 'mask': // * * - case 'limitMessage': // * - case 'defaultInput': // * - case 'encoding': // * * - value = value != null ? value + '' : ''; - if (value && optionName !== 'limitMessage') { value = value.replace(/[\r\n]/g, ''); } - options[optionName] = value; - break; - // ================ number(int) - case 'bufferSize': // * * - if (!isNaN(value = parseInt(value, 10)) && typeof value === 'number') { - options[optionName] = value; // limited updating (number is needed) - } - break; - // ================ boolean - case 'displayOnly': // * - case 'keyIn': // * - case 'hideEchoBack': // * * - case 'caseSensitive': // * * - case 'keepWhitespace': // * * - case 'history': // * - case 'cd': // * - options[optionName] = !!value; - break; - // ================ array - case 'limit': // * * to string for readlineExt - case 'trueValue': // * - case 'falseValue': // * - options[optionName] = flattenArray(value, function(value) { - var type = typeof value; - return type === 'string' || type === 'number' || - type === 'function' || value instanceof RegExp; - }).map(function(value) { - return typeof value === 'string' ? value.replace(/[\r\n]/g, '') : value; - }); - break; - // ================ function - case 'print': // * * - case 'phContent': // * - case 'preCheck': // * - options[optionName] = typeof value === 'function' ? value : void 0; - break; - // ================ other - case 'prompt': // * - case 'display': // * - options[optionName] = value != null ? value : ''; - break; - // no default - } - }); - return options; - }, {}); -} - -function isMatched(res, comps, caseSensitive) { - return comps.some(function(comp) { - var type = typeof comp; - return type === 'string' ? - (caseSensitive ? res === comp : res.toLowerCase() === comp.toLowerCase()) : - type === 'number' ? parseFloat(res) === comp : - type === 'function' ? comp(res) : - comp instanceof RegExp ? comp.test(res) : false; - }); -} - -function replaceHomePath(path, expand) { - var homePath = pathUtil.normalize( - IS_WIN ? (process.env.HOMEDRIVE || '') + (process.env.HOMEPATH || '') : - process.env.HOME || '').replace(/[\/\\]+$/, ''); - path = pathUtil.normalize(path); - return expand ? path.replace(/^~(?=\/|\\|$)/, homePath) : - path.replace(new RegExp('^' + escapePattern(homePath) + - '(?=\\/|\\\\|$)', IS_WIN ? 'i' : ''), '~'); -} - -function replacePlaceholder(text, generator) { - var PTN_INNER = '(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?', - rePlaceholder = new RegExp('(\\$)?(\\$<' + PTN_INNER + '>)', 'g'), - rePlaceholderCompat = new RegExp('(\\$)?(\\$\\{' + PTN_INNER + '\\})', 'g'); - - function getPlaceholderText(s, escape, placeholder, pre, param, post) { - var text; - return escape || typeof (text = generator(param)) !== 'string' ? placeholder : - text ? (pre || '') + text + (post || '') : ''; - } - - return text.replace(rePlaceholder, getPlaceholderText) - .replace(rePlaceholderCompat, getPlaceholderText); -} - -function array2charlist(array, caseSensitive, collectSymbols) { - var values, group = [], groupClass = -1, charCode = 0, symbols = '', suppressed; - function addGroup(groups, group) { - if (group.length > 3) { // ellipsis - groups.push(group[0] + '...' + group[group.length - 1]); - suppressed = true; - } else if (group.length) { - groups = groups.concat(group); - } - return groups; - } - - values = array.reduce( - function(chars, value) { return chars.concat((value + '').split('')); }, []) - .reduce(function(groups, curChar) { - var curGroupClass, curCharCode; - if (!caseSensitive) { curChar = curChar.toLowerCase(); } - curGroupClass = /^\d$/.test(curChar) ? 1 : - /^[A-Z]$/.test(curChar) ? 2 : /^[a-z]$/.test(curChar) ? 3 : 0; - if (collectSymbols && curGroupClass === 0) { - symbols += curChar; - } else { - curCharCode = curChar.charCodeAt(0); - if (curGroupClass && curGroupClass === groupClass && - curCharCode === charCode + 1) { - group.push(curChar); - } else { - groups = addGroup(groups, group); - group = [curChar]; - groupClass = curGroupClass; - } - charCode = curCharCode; - } - return groups; - }, []); - values = addGroup(values, group); // last group - if (symbols) { values.push(symbols); suppressed = true; } - return {values: values, suppressed: suppressed}; -} - -function joinChunks(chunks, suppressed) { - return chunks.join(chunks.length > 2 ? ', ' : suppressed ? ' / ' : '/'); -} - -function getPhContent(param, options) { - var text, values, resCharlist = {}, arg; - if (options.phContent) { - text = options.phContent(param, options); - } - if (typeof text !== 'string') { - switch (param) { - case 'hideEchoBack': - case 'mask': - case 'defaultInput': - case 'caseSensitive': - case 'keepWhitespace': - case 'encoding': - case 'bufferSize': - case 'history': - case 'cd': - text = !options.hasOwnProperty(param) ? '' : - typeof options[param] === 'boolean' ? (options[param] ? 'on' : 'off') : - options[param] + ''; - break; - // case 'prompt': - // case 'query': - // case 'display': - // text = options.hasOwnProperty('displaySrc') ? options.displaySrc + '' : ''; - // break; - case 'limit': - case 'trueValue': - case 'falseValue': - values = options[options.hasOwnProperty(param + 'Src') ? param + 'Src' : param]; - if (options.keyIn) { // suppress - resCharlist = array2charlist(values, options.caseSensitive); - values = resCharlist.values; - } else { - values = values.filter(function(value) { - var type = typeof value; - return type === 'string' || type === 'number'; - }); - } - text = joinChunks(values, resCharlist.suppressed); - break; - case 'limitCount': - case 'limitCountNotZero': - text = options[options.hasOwnProperty('limitSrc') ? - 'limitSrc' : 'limit'].length; - text = text || param !== 'limitCountNotZero' ? text + '' : ''; - break; - case 'lastInput': - text = lastInput; - break; - case 'cwd': - case 'CWD': - case 'cwdHome': - text = process.cwd(); - if (param === 'CWD') { - text = pathUtil.basename(text); - } else if (param === 'cwdHome') { - text = replaceHomePath(text); - } - break; - case 'date': - case 'time': - case 'localeDate': - case 'localeTime': - text = (new Date())['to' + - param.replace(/^./, function(str) { return str.toUpperCase(); }) + - 'String'](); - break; - default: // with arg - if (typeof (arg = (param.match(/^history_m(\d+)$/) || [])[1]) === 'string') { - text = inputHistory[inputHistory.length - arg] || ''; - } - } - } - return text; -} - -function getPhCharlist(param) { - var matches = /^(.)-(.)$/.exec(param), text = '', from, to, code, step; - if (!matches) { return null; } - from = matches[1].charCodeAt(0); - to = matches[2].charCodeAt(0); - step = from < to ? 1 : -1; - for (code = from; code !== to + step; code += step) { text += String.fromCharCode(code); } - return text; -} - -// cmd "arg" " a r g " "" 'a"r"g' "a""rg" "arg -function parseCl(cl) { - var reToken = new RegExp(/(\s*)(?:("|')(.*?)(?:\2|$)|(\S+))/g), matches, - taken = '', args = [], part; - cl = cl.trim(); - while ((matches = reToken.exec(cl))) { - part = matches[3] || matches[4] || ''; - if (matches[1]) { - args.push(taken); - taken = ''; - } - taken += part; - } - if (taken) { args.push(taken); } - return args; -} - -function toBool(res, options) { - return ( - (options.trueValue.length && - isMatched(res, options.trueValue, options.caseSensitive)) ? true : - (options.falseValue.length && - isMatched(res, options.falseValue, options.caseSensitive)) ? false : res); -} - -function getValidLine(options) { - var res, forceNext, limitMessage, - matches, histInput, args, resCheck; - - function _getPhContent(param) { return getPhContent(param, options); } - function addDisplay(text) { options.display += (/[^\r\n]$/.test(options.display) ? '\n' : '') + text; } - - options.limitSrc = options.limit; - options.displaySrc = options.display; - options.limit = ''; // for readlineExt - options.display = replacePlaceholder(options.display + '', _getPhContent); - - while (true) { - res = _readlineSync(options); - forceNext = false; - limitMessage = ''; - - if (options.defaultInput && !res) { res = options.defaultInput; } - - if (options.history) { - if ((matches = /^\s*\!(?:\!|-1)(:p)?\s*$/.exec(res))) { // `!!` `!-1` +`:p` - histInput = inputHistory[0] || ''; - if (matches[1]) { // only display - forceNext = true; - } else { // replace input - res = histInput; - } - // Show it even if it is empty (NL only). - addDisplay(histInput + '\n'); - if (!forceNext) { // Loop may break - options.displayOnly = true; - _readlineSync(options); - options.displayOnly = false; - } - } else if (res && res !== inputHistory[inputHistory.length - 1]) { - inputHistory = [res]; - } - } - - if (!forceNext && options.cd && res) { - args = parseCl(res); - switch (args[0].toLowerCase()) { - case 'cd': - if (args[1]) { - try { - process.chdir(replaceHomePath(args[1], true)); - } catch (e) { - addDisplay(e + ''); - } - } - forceNext = true; - break; - case 'pwd': - addDisplay(process.cwd()); - forceNext = true; - break; - // no default - } - } - - if (!forceNext && options.preCheck) { - resCheck = options.preCheck(res, options); - res = resCheck.res; - if (resCheck.forceNext) { forceNext = true; } // Don't switch to false. - } - - if (!forceNext) { - if (!options.limitSrc.length || - isMatched(res, options.limitSrc, options.caseSensitive)) { break; } - if (options.limitMessage) { - limitMessage = replacePlaceholder(options.limitMessage, _getPhContent); - } - } - - addDisplay((limitMessage ? limitMessage + '\n' : '') + - replacePlaceholder(options.displaySrc + '', _getPhContent)); - } - return toBool(res, options); -} - -// for dev -exports._DBG_set_useExt = function(val) { _DBG_useExt = val; }; -exports._DBG_set_checkOptions = function(val) { _DBG_checkOptions = val; }; -exports._DBG_set_checkMethod = function(val) { _DBG_checkMethod = val; }; -exports._DBG_clearHistory = function() { lastInput = ''; inputHistory = []; }; - -// ------------------------------------ - -exports.setDefaultOptions = function(options) { - defaultOptions = margeOptions(true, options); - return margeOptions(true); // copy -}; - -exports.question = function(query, options) { - /* eslint-disable key-spacing */ - return getValidLine(margeOptions(margeOptions(true, options), { - display: query - })); - /* eslint-enable key-spacing */ -}; - -exports.prompt = function(options) { - var readOptions = margeOptions(true, options); - readOptions.display = readOptions.prompt; - return getValidLine(readOptions); -}; - -exports.keyIn = function(query, options) { - /* eslint-disable key-spacing */ - var readOptions = margeOptions(margeOptions(true, options), { - display: query, - keyIn: true, - keepWhitespace: true - }); - /* eslint-enable key-spacing */ - - // char list - readOptions.limitSrc = readOptions.limit.filter(function(value) { - var type = typeof value; - return type === 'string' || type === 'number'; - }) - .map(function(text) { return replacePlaceholder(text + '', getPhCharlist); }); - // pattern - readOptions.limit = escapePattern(readOptions.limitSrc.join('')); - - ['trueValue', 'falseValue'].forEach(function(optionName) { - readOptions[optionName] = readOptions[optionName].reduce(function(comps, comp) { - var type = typeof comp; - if (type === 'string' || type === 'number') { - comps = comps.concat((comp + '').split('')); - } else { comps.push(comp); } - return comps; - }, []); - }); - - readOptions.display = replacePlaceholder(readOptions.display + '', - function(param) { return getPhContent(param, readOptions); }); - - return toBool(_readlineSync(readOptions), readOptions); -}; - -// ------------------------------------ - -exports.questionEMail = function(query, options) { - if (query == null) { query = 'Input e-mail address: '; } - /* eslint-disable key-spacing */ - return exports.question(query, margeOptions({ - // -------- default - hideEchoBack: false, - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address - limit: /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, - limitMessage: 'Input valid e-mail address, please.', - trueValue: null, - falseValue: null - }, options, { - // -------- forced - keepWhitespace: false, - cd: false - })); - /* eslint-enable key-spacing */ -}; - -exports.questionNewPassword = function(query, options) { - /* eslint-disable key-spacing */ - var resCharlist, min, max, - readOptions = margeOptions({ - // -------- default - hideEchoBack: true, - mask: '*', - limitMessage: 'It can include: $\n' + - 'And the length must be: $', - trueValue: null, - falseValue: null, - caseSensitive: true - }, options, { - // -------- forced - history: false, - cd: false, - // limit (by charlist etc.), - phContent: function(param) { - return param === 'charlist' ? resCharlist.text : - param === 'length' ? min + '...' + max : null; - } - }), - // added: charlist, min, max, confirmMessage, unmatchMessage - charlist, confirmMessage, unmatchMessage, - limit, limitMessage, res1, res2; - /* eslint-enable key-spacing */ - options = options || {}; - - charlist = replacePlaceholder( - options.charlist ? options.charlist + '' : '$', getPhCharlist); - if (isNaN(min = parseInt(options.min, 10)) || typeof min !== 'number') { min = 12; } - if (isNaN(max = parseInt(options.max, 10)) || typeof max !== 'number') { max = 24; } - limit = new RegExp('^[' + escapePattern(charlist) + - ']{' + min + ',' + max + '}$'); - resCharlist = array2charlist([charlist], readOptions.caseSensitive, true); - resCharlist.text = joinChunks(resCharlist.values, resCharlist.suppressed); - - confirmMessage = options.confirmMessage != null ? options.confirmMessage : - 'Reinput a same one to confirm it: '; - unmatchMessage = options.unmatchMessage != null ? options.unmatchMessage : - 'It differs from first one.' + - ' Hit only the Enter key if you want to retry from first one.'; - - if (query == null) { query = 'Input new password: '; } - - limitMessage = readOptions.limitMessage; - while (!res2) { - readOptions.limit = limit; - readOptions.limitMessage = limitMessage; - res1 = exports.question(query, readOptions); - - readOptions.limit = [res1, '']; - readOptions.limitMessage = unmatchMessage; - res2 = exports.question(confirmMessage, readOptions); - } - - return res1; -}; - -function _questionNum(query, options, parser) { - var validValue; - function getValidValue(value) { - validValue = parser(value); - return !isNaN(validValue) && typeof validValue === 'number'; - } - /* eslint-disable key-spacing */ - exports.question(query, margeOptions({ - // -------- default - limitMessage: 'Input valid number, please.' - }, options, { - // -------- forced - limit: getValidValue, - cd: false - // trueValue, falseValue, caseSensitive, keepWhitespace don't work. - })); - /* eslint-enable key-spacing */ - return validValue; -} -exports.questionInt = function(query, options) { - return _questionNum(query, options, function(value) { return parseInt(value, 10); }); -}; -exports.questionFloat = function(query, options) { - return _questionNum(query, options, parseFloat); -}; - -exports.questionPath = function(query, options) { - /* eslint-disable key-spacing */ - var validPath, error = '', - readOptions = margeOptions({ - // -------- default - hideEchoBack: false, - limitMessage: '$Input valid path, please.' + - '$<( Min:)min>$<( Max:)max>', - history: true, - cd: true - }, options, { - // -------- forced - keepWhitespace: false, - limit: function(value) { - var exists, stat, res; - value = replaceHomePath(value, true); - error = ''; // for validate - // mkdir -p - function mkdirParents(dirPath) { - dirPath.split(/\/|\\/).reduce(function(parents, dir) { - var path = pathUtil.resolve((parents += dir + pathUtil.sep)); - if (!fs.existsSync(path)) { - fs.mkdirSync(path); - } else if (!fs.statSync(path).isDirectory()) { - throw new Error('Non directory already exists: ' + path); - } - return parents; - }, ''); - } - - try { - exists = fs.existsSync(value); - validPath = exists ? fs.realpathSync(value) : pathUtil.resolve(value); - // options.exists default: true, not-bool: no-check - if (!options.hasOwnProperty('exists') && !exists || - typeof options.exists === 'boolean' && options.exists !== exists) { - error = (exists ? 'Already exists' : 'No such file or directory') + - ': ' + validPath; - return false; - } - if (!exists && options.create) { - if (options.isDirectory) { - mkdirParents(validPath); - } else { - mkdirParents(pathUtil.dirname(validPath)); - fs.closeSync(fs.openSync(validPath, 'w')); // touch - } - validPath = fs.realpathSync(validPath); - } - if (exists && (options.min || options.max || - options.isFile || options.isDirectory)) { - stat = fs.statSync(validPath); - // type check first (directory has zero size) - if (options.isFile && !stat.isFile()) { - error = 'Not file: ' + validPath; - return false; - } else if (options.isDirectory && !stat.isDirectory()) { - error = 'Not directory: ' + validPath; - return false; - } else if (options.min && stat.size < +options.min || - options.max && stat.size > +options.max) { - error = 'Size ' + stat.size + ' is out of range: ' + validPath; - return false; - } - } - if (typeof options.validate === 'function' && - (res = options.validate(validPath)) !== true) { - if (typeof res === 'string') { error = res; } - return false; - } - } catch (e) { - error = e + ''; - return false; - } - return true; - }, - // trueValue, falseValue, caseSensitive don't work. - phContent: function(param) { - return param === 'error' ? error : - param !== 'min' && param !== 'max' ? null : - options.hasOwnProperty(param) ? options[param] + '' : ''; - } - }); - // added: exists, create, min, max, isFile, isDirectory, validate - /* eslint-enable key-spacing */ - options = options || {}; - - if (query == null) { query = 'Input path (you can "cd" and "pwd"): '; } - - exports.question(query, readOptions); - return validPath; -}; - -// props: preCheck, args, hRes, limit -function getClHandler(commandHandler, options) { - var clHandler = {}, hIndex = {}; - if (typeof commandHandler === 'object') { - Object.keys(commandHandler).forEach(function(cmd) { - if (typeof commandHandler[cmd] === 'function') { - hIndex[options.caseSensitive ? cmd : cmd.toLowerCase()] = commandHandler[cmd]; - } - }); - clHandler.preCheck = function(res) { - var cmdKey; - clHandler.args = parseCl(res); - cmdKey = clHandler.args[0] || ''; - if (!options.caseSensitive) { cmdKey = cmdKey.toLowerCase(); } - clHandler.hRes = - cmdKey !== '_' && hIndex.hasOwnProperty(cmdKey) ? - hIndex[cmdKey].apply(res, clHandler.args.slice(1)) : - hIndex.hasOwnProperty('_') ? hIndex._.apply(res, clHandler.args) : null; - return {res: res, forceNext: false}; - }; - if (!hIndex.hasOwnProperty('_')) { - clHandler.limit = function() { // It's called after preCheck. - var cmdKey = clHandler.args[0] || ''; - if (!options.caseSensitive) { cmdKey = cmdKey.toLowerCase(); } - return hIndex.hasOwnProperty(cmdKey); - }; - } - } else { - clHandler.preCheck = function(res) { - clHandler.args = parseCl(res); - clHandler.hRes = typeof commandHandler === 'function' ? - commandHandler.apply(res, clHandler.args) : true; // true for break loop - return {res: res, forceNext: false}; - }; - } - return clHandler; -} - -exports.promptCL = function(commandHandler, options) { - /* eslint-disable key-spacing */ - var readOptions = margeOptions({ - // -------- default - hideEchoBack: false, - limitMessage: 'Requested command is not available.', - caseSensitive: false, - history: true - }, options), - // -------- forced - // trueValue, falseValue, keepWhitespace don't work. - // preCheck, limit (by clHandler) - clHandler = getClHandler(commandHandler, readOptions); - /* eslint-enable key-spacing */ - readOptions.limit = clHandler.limit; - readOptions.preCheck = clHandler.preCheck; - exports.prompt(readOptions); - return clHandler.args; -}; - -exports.promptLoop = function(inputHandler, options) { - /* eslint-disable key-spacing */ - var readOptions = margeOptions({ - // -------- default - hideEchoBack: false, - trueValue: null, - falseValue: null, - caseSensitive: false, - history: true - }, options); - /* eslint-enable key-spacing */ - while (true) { if (inputHandler(exports.prompt(readOptions))) { break; } } - return; -}; - -exports.promptCLLoop = function(commandHandler, options) { - /* eslint-disable key-spacing */ - var readOptions = margeOptions({ - // -------- default - hideEchoBack: false, - limitMessage: 'Requested command is not available.', - caseSensitive: false, - history: true - }, options), - // -------- forced - // trueValue, falseValue, keepWhitespace don't work. - // preCheck, limit (by clHandler) - clHandler = getClHandler(commandHandler, readOptions); - /* eslint-enable key-spacing */ - readOptions.limit = clHandler.limit; - readOptions.preCheck = clHandler.preCheck; - while (true) { - exports.prompt(readOptions); - if (clHandler.hRes) { break; } - } - return; -}; - -exports.promptSimShell = function(options) { - /* eslint-disable key-spacing */ - return exports.prompt(margeOptions({ - // -------- default - hideEchoBack: false, - history: true - }, options, { - // -------- forced - prompt: (function() { - return IS_WIN ? - '$>' : - // 'user@host:cwd$ ' - (process.env.USER || '') + - (process.env.HOSTNAME ? - '@' + process.env.HOSTNAME.replace(/\..*$/, '') : '') + - ':$$ '; - })() - })); - /* eslint-enable key-spacing */ -}; - -function _keyInYN(query, options, limit) { - var res; - if (query == null) { query = 'Are you sure? '; } - if ((!options || options.guide !== false) && (query += '')) { - query = query.replace(/\s*:?\s*$/, '') + ' [y/n]: '; - } - /* eslint-disable key-spacing */ - res = exports.keyIn(query, margeOptions(options, { - // -------- forced - hideEchoBack: false, - limit: limit, - trueValue: 'y', - falseValue: 'n', - caseSensitive: false - // mask doesn't work. - })); - // added: guide - /* eslint-enable key-spacing */ - return typeof res === 'boolean' ? res : ''; -} -exports.keyInYN = function(query, options) { return _keyInYN(query, options); }; -exports.keyInYNStrict = function(query, options) { return _keyInYN(query, options, 'yn'); }; - -exports.keyInPause = function(query, options) { - if (query == null) { query = 'Continue...'; } - if ((!options || options.guide !== false) && (query += '')) { - query = query.replace(/\s+$/, '') + ' (Hit any key)'; - } - /* eslint-disable key-spacing */ - exports.keyIn(query, margeOptions({ - // -------- default - limit: null - }, options, { - // -------- forced - hideEchoBack: true, - mask: '' - })); - // added: guide - /* eslint-enable key-spacing */ - return; -}; - -exports.keyInSelect = function(items, query, options) { - /* eslint-disable key-spacing */ - var readOptions = margeOptions({ - // -------- default - hideEchoBack: false - }, options, { - // -------- forced - trueValue: null, - falseValue: null, - caseSensitive: false, - // limit (by items), - phContent: function(param) { - return param === 'itemsCount' ? items.length + '' : - param === 'firstItem' ? (items[0] + '').trim() : - param === 'lastItem' ? (items[items.length - 1] + '').trim() : null; - } - }), - // added: guide, cancel - keylist = '', key2i = {}, charCode = 49 /* '1' */, display = '\n'; - /* eslint-enable key-spacing */ - if (!Array.isArray(items) || !items.length || items.length > 35) { - throw '`items` must be Array (max length: 35).'; - } - - items.forEach(function(item, i) { - var key = String.fromCharCode(charCode); - keylist += key; - key2i[key] = i; - display += '[' + key + '] ' + (item + '').trim() + '\n'; - charCode = charCode === 57 /* '9' */ ? 97 /* 'a' */ : charCode + 1; - }); - if (!options || options.cancel !== false) { - keylist += '0'; - key2i['0'] = -1; - display += '[0] ' + - (options && options.cancel != null && typeof options.cancel !== 'boolean' ? - (options.cancel + '').trim() : 'CANCEL') + '\n'; - } - readOptions.limit = keylist; - display += '\n'; - - if (query == null) { query = 'Choose one from list: '; } - if ((query += '')) { - if (!options || options.guide !== false) { - query = query.replace(/\s*:?\s*$/, '') + ' [$]: '; - } - display += query; - } - - return key2i[exports.keyIn(display, readOptions).toLowerCase()]; -}; - -exports.getRawInput = function() { return rawInput; }; - -// ======== DEPRECATED ======== -function _setOption(optionName, args) { - var options; - if (args.length) { options = {}; options[optionName] = args[0]; } - return exports.setDefaultOptions(options)[optionName]; -} -exports.setPrint = function() { return _setOption('print', arguments); }; -exports.setPrompt = function() { return _setOption('prompt', arguments); }; -exports.setEncoding = function() { return _setOption('encoding', arguments); }; -exports.setMask = function() { return _setOption('mask', arguments); }; -exports.setBufferSize = function() { return _setOption('bufferSize', arguments); }; - -}).call(this,require("path").join(__dirname,"node_modules","readline-sync","lib")) -},{"child_process":undefined,"crypto":undefined,"fs":undefined,"os":undefined,"path":undefined}],130:[function(require,module,exports){ -// Copyright 2010-2012 Mikeal Rogers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -'use strict' - -var extend = require('extend') -var cookies = require('./lib/cookies') -var helpers = require('./lib/helpers') - -var paramsHaveRequestBody = helpers.paramsHaveRequestBody - -// organize params for patch, post, put, head, del -function initParams (uri, options, callback) { - if (typeof options === 'function') { - callback = options - } - - var params = {} - if (typeof options === 'object') { - extend(params, options, {uri: uri}) - } else if (typeof uri === 'string') { - extend(params, {uri: uri}) - } else { - extend(params, uri) - } - - params.callback = callback || params.callback - return params -} - -function request (uri, options, callback) { - if (typeof uri === 'undefined') { - throw new Error('undefined is not a valid uri or options object.') - } - - var params = initParams(uri, options, callback) - - if (params.method === 'HEAD' && paramsHaveRequestBody(params)) { - throw new Error('HTTP HEAD requests MUST NOT include a request body.') - } - - return new request.Request(params) -} - -function verbFunc (verb) { - var method = verb.toUpperCase() - return function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.method = method - return request(params, params.callback) - } -} - -// define like this to please codeintel/intellisense IDEs -request.get = verbFunc('get') -request.head = verbFunc('head') -request.options = verbFunc('options') -request.post = verbFunc('post') -request.put = verbFunc('put') -request.patch = verbFunc('patch') -request.del = verbFunc('delete') -request['delete'] = verbFunc('delete') - -request.jar = function (store) { - return cookies.jar(store) -} - -request.cookie = function (str) { - return cookies.parse(str) -} - -function wrapRequestMethod (method, options, requester, verb) { - return function (uri, opts, callback) { - var params = initParams(uri, opts, callback) - - var target = {} - extend(true, target, options, params) - - target.pool = params.pool || options.pool - - if (verb) { - target.method = verb.toUpperCase() - } - - if (typeof requester === 'function') { - method = requester - } - - return method(target, target.callback) - } -} - -request.defaults = function (options, requester) { - var self = this - - options = options || {} - - if (typeof options === 'function') { - requester = options - options = {} - } - - var defaults = wrapRequestMethod(self, options, requester) - - var verbs = ['get', 'head', 'post', 'put', 'patch', 'del', 'delete'] - verbs.forEach(function (verb) { - defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb) - }) - - defaults.cookie = wrapRequestMethod(self.cookie, options, requester) - defaults.jar = self.jar - defaults.defaults = self.defaults - return defaults -} - -request.forever = function (agentOptions, optionsArg) { - var options = {} - if (optionsArg) { - extend(options, optionsArg) - } - if (agentOptions) { - options.agentOptions = agentOptions - } - - options.forever = true - return request.defaults(options) -} - -// Exports - -module.exports = request -request.Request = require('./request') -request.initParams = initParams - -// Backwards compatibility for request.debug -Object.defineProperty(request, 'debug', { - enumerable: true, - get: function () { - return request.Request.debug - }, - set: function (debug) { - request.Request.debug = debug - } -}) - -},{"./lib/cookies":132,"./lib/helpers":135,"./request":178,"extend":81}],131:[function(require,module,exports){ -'use strict' - -var caseless = require('caseless') -var uuid = require('uuid') -var helpers = require('./helpers') - -var md5 = helpers.md5 -var toBase64 = helpers.toBase64 - -function Auth (request) { - // define all public properties here - this.request = request - this.hasAuth = false - this.sentAuth = false - this.bearerToken = null - this.user = null - this.pass = null -} - -Auth.prototype.basic = function (user, pass, sendImmediately) { - var self = this - if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) { - self.request.emit('error', new Error('auth() received invalid user or password')) - } - self.user = user - self.pass = pass - self.hasAuth = true - var header = user + ':' + (pass || '') - if (sendImmediately || typeof sendImmediately === 'undefined') { - var authHeader = 'Basic ' + toBase64(header) - self.sentAuth = true - return authHeader - } -} - -Auth.prototype.bearer = function (bearer, sendImmediately) { - var self = this - self.bearerToken = bearer - self.hasAuth = true - if (sendImmediately || typeof sendImmediately === 'undefined') { - if (typeof bearer === 'function') { - bearer = bearer() - } - var authHeader = 'Bearer ' + (bearer || '') - self.sentAuth = true - return authHeader - } -} - -Auth.prototype.digest = function (method, path, authHeader) { - // TODO: More complete implementation of RFC 2617. - // - handle challenge.domain - // - support qop="auth-int" only - // - handle Authentication-Info (not necessarily?) - // - check challenge.stale (not necessarily?) - // - increase nc (not necessarily?) - // For reference: - // http://tools.ietf.org/html/rfc2617#section-3 - // https://github.com/bagder/curl/blob/master/lib/http_digest.c - - var self = this - - var challenge = {} - var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi - for (;;) { - var match = re.exec(authHeader) - if (!match) { - break - } - challenge[match[1]] = match[2] || match[3] - } - - /** - * RFC 2617: handle both MD5 and MD5-sess algorithms. - * - * If the algorithm directive's value is "MD5" or unspecified, then HA1 is - * HA1=MD5(username:realm:password) - * If the algorithm directive's value is "MD5-sess", then HA1 is - * HA1=MD5(MD5(username:realm:password):nonce:cnonce) - */ - var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) { - var ha1 = md5(user + ':' + realm + ':' + pass) - if (algorithm && algorithm.toLowerCase() === 'md5-sess') { - return md5(ha1 + ':' + nonce + ':' + cnonce) - } else { - return ha1 - } - } - - var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth' - var nc = qop && '00000001' - var cnonce = qop && uuid().replace(/-/g, '') - var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce) - var ha2 = md5(method + ':' + path) - var digestResponse = qop - ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) - : md5(ha1 + ':' + challenge.nonce + ':' + ha2) - var authValues = { - username: self.user, - realm: challenge.realm, - nonce: challenge.nonce, - uri: path, - qop: qop, - response: digestResponse, - nc: nc, - cnonce: cnonce, - algorithm: challenge.algorithm, - opaque: challenge.opaque - } - - authHeader = [] - for (var k in authValues) { - if (authValues[k]) { - if (k === 'qop' || k === 'nc' || k === 'algorithm') { - authHeader.push(k + '=' + authValues[k]) - } else { - authHeader.push(k + '="' + authValues[k] + '"') - } - } - } - authHeader = 'Digest ' + authHeader.join(', ') - self.sentAuth = true - return authHeader -} - -Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) { - var self = this - var request = self.request - - var authHeader - if (bearer === undefined && user === undefined) { - self.request.emit('error', new Error('no auth mechanism defined')) - } else if (bearer !== undefined) { - authHeader = self.bearer(bearer, sendImmediately) - } else { - authHeader = self.basic(user, pass, sendImmediately) - } - if (authHeader) { - request.setHeader('authorization', authHeader) - } -} - -Auth.prototype.onResponse = function (response) { - var self = this - var request = self.request - - if (!self.hasAuth || self.sentAuth) { return null } - - var c = caseless(response.headers) - - var authHeader = c.get('www-authenticate') - var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase() - request.debug('reauth', authVerb) - - switch (authVerb) { - case 'basic': - return self.basic(self.user, self.pass, true) - - case 'bearer': - return self.bearer(self.bearerToken, true) - - case 'digest': - return self.digest(request.method, request.path, authHeader) - } -} - -exports.Auth = Auth - -},{"./helpers":135,"caseless":144,"uuid":209}],132:[function(require,module,exports){ -'use strict' - -var tough = require('tough-cookie') - -var Cookie = tough.Cookie -var CookieJar = tough.CookieJar - -exports.parse = function (str) { - if (str && str.uri) { - str = str.uri - } - if (typeof str !== 'string') { - throw new Error('The cookie function only accepts STRING as param') - } - return Cookie.parse(str, {loose: true}) -} - -// Adapt the sometimes-Async api of tough.CookieJar to our requirements -function RequestJar (store) { - var self = this - self._jar = new CookieJar(store, {looseMode: true}) -} -RequestJar.prototype.setCookie = function (cookieOrStr, uri, options) { - var self = this - return self._jar.setCookieSync(cookieOrStr, uri, options || {}) -} -RequestJar.prototype.getCookieString = function (uri) { - var self = this - return self._jar.getCookieStringSync(uri) -} -RequestJar.prototype.getCookies = function (uri) { - var self = this - return self._jar.getCookiesSync(uri) -} - -exports.jar = function (store) { - return new RequestJar(store) -} - -},{"tough-cookie":170}],133:[function(require,module,exports){ -'use strict' - -function formatHostname (hostname) { - // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' - return hostname.replace(/^\.*/, '.').toLowerCase() -} - -function parseNoProxyZone (zone) { - zone = zone.trim().toLowerCase() - - var zoneParts = zone.split(':', 2) - var zoneHost = formatHostname(zoneParts[0]) - var zonePort = zoneParts[1] - var hasPort = zone.indexOf(':') > -1 - - return {hostname: zoneHost, port: zonePort, hasPort: hasPort} -} - -function uriInNoProxy (uri, noProxy) { - var port = uri.port || (uri.protocol === 'https:' ? '443' : '80') - var hostname = formatHostname(uri.hostname) - var noProxyList = noProxy.split(',') - - // iterate through the noProxyList until it finds a match. - return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) { - var isMatchedAt = hostname.indexOf(noProxyZone.hostname) - var hostnameMatched = ( - isMatchedAt > -1 && - (isMatchedAt === hostname.length - noProxyZone.hostname.length) - ) - - if (noProxyZone.hasPort) { - return (port === noProxyZone.port) && hostnameMatched - } - - return hostnameMatched - }) -} - -function getProxyFromURI (uri) { - // Decide the proper request proxy to use based on the request URI object and the - // environmental variables (NO_PROXY, HTTP_PROXY, etc.) - // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html) - - var noProxy = process.env.NO_PROXY || process.env.no_proxy || '' - - // if the noProxy is a wildcard then return null - - if (noProxy === '*') { - return null - } - - // if the noProxy is not empty and the uri is found return null - - if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { - return null - } - - // Check for HTTP or HTTPS Proxy in environment Else default to null - - if (uri.protocol === 'http:') { - return process.env.HTTP_PROXY || - process.env.http_proxy || null - } - - if (uri.protocol === 'https:') { - return process.env.HTTPS_PROXY || - process.env.https_proxy || - process.env.HTTP_PROXY || - process.env.http_proxy || null - } - - // if none of that works, return null - // (What uri protocol are you using then?) - - return null -} - -module.exports = getProxyFromURI - -},{}],134:[function(require,module,exports){ -'use strict' - -var fs = require('fs') -var qs = require('querystring') -var validate = require('har-validator') -var extend = require('extend') - -function Har (request) { - this.request = request -} - -Har.prototype.reducer = function (obj, pair) { - // new property ? - if (obj[pair.name] === undefined) { - obj[pair.name] = pair.value - return obj - } - - // existing? convert to array - var arr = [ - obj[pair.name], - pair.value - ] - - obj[pair.name] = arr - - return obj -} - -Har.prototype.prep = function (data) { - // construct utility properties - data.queryObj = {} - data.headersObj = {} - data.postData.jsonObj = false - data.postData.paramsObj = false - - // construct query objects - if (data.queryString && data.queryString.length) { - data.queryObj = data.queryString.reduce(this.reducer, {}) - } - - // construct headers objects - if (data.headers && data.headers.length) { - // loweCase header keys - data.headersObj = data.headers.reduceRight(function (headers, header) { - headers[header.name] = header.value - return headers - }, {}) - } - - // construct Cookie header - if (data.cookies && data.cookies.length) { - var cookies = data.cookies.map(function (cookie) { - return cookie.name + '=' + cookie.value - }) - - if (cookies.length) { - data.headersObj.cookie = cookies.join('; ') - } - } - - // prep body - function some (arr) { - return arr.some(function (type) { - return data.postData.mimeType.indexOf(type) === 0 - }) - } - - if (some([ - 'multipart/mixed', - 'multipart/related', - 'multipart/form-data', - 'multipart/alternative'])) { - // reset values - data.postData.mimeType = 'multipart/form-data' - } else if (some([ - 'application/x-www-form-urlencoded'])) { - if (!data.postData.params) { - data.postData.text = '' - } else { - data.postData.paramsObj = data.postData.params.reduce(this.reducer, {}) - - // always overwrite - data.postData.text = qs.stringify(data.postData.paramsObj) - } - } else if (some([ - 'text/json', - 'text/x-json', - 'application/json', - 'application/x-json'])) { - data.postData.mimeType = 'application/json' - - if (data.postData.text) { - try { - data.postData.jsonObj = JSON.parse(data.postData.text) - } catch (e) { - this.request.debug(e) - - // force back to text/plain - data.postData.mimeType = 'text/plain' - } - } - } - - return data -} - -Har.prototype.options = function (options) { - // skip if no har property defined - if (!options.har) { - return options - } - - var har = {} - extend(har, options.har) - - // only process the first entry - if (har.log && har.log.entries) { - har = har.log.entries[0] - } - - // add optional properties to make validation successful - har.url = har.url || options.url || options.uri || options.baseUrl || '/' - har.httpVersion = har.httpVersion || 'HTTP/1.1' - har.queryString = har.queryString || [] - har.headers = har.headers || [] - har.cookies = har.cookies || [] - har.postData = har.postData || {} - har.postData.mimeType = har.postData.mimeType || 'application/octet-stream' - - har.bodySize = 0 - har.headersSize = 0 - har.postData.size = 0 - - if (!validate.request(har)) { - return options - } - - // clean up and get some utility properties - var req = this.prep(har) - - // construct new options - if (req.url) { - options.url = req.url - } - - if (req.method) { - options.method = req.method - } - - if (Object.keys(req.queryObj).length) { - options.qs = req.queryObj - } - - if (Object.keys(req.headersObj).length) { - options.headers = req.headersObj - } - - function test (type) { - return req.postData.mimeType.indexOf(type) === 0 - } - if (test('application/x-www-form-urlencoded')) { - options.form = req.postData.paramsObj - } else if (test('application/json')) { - if (req.postData.jsonObj) { - options.body = req.postData.jsonObj - options.json = true - } - } else if (test('multipart/form-data')) { - options.formData = {} - - req.postData.params.forEach(function (param) { - var attachment = {} - - if (!param.fileName && !param.fileName && !param.contentType) { - options.formData[param.name] = param.value - return - } - - // attempt to read from disk! - if (param.fileName && !param.value) { - attachment.value = fs.createReadStream(param.fileName) - } else if (param.value) { - attachment.value = param.value - } - - if (param.fileName) { - attachment.options = { - filename: param.fileName, - contentType: param.contentType ? param.contentType : null - } - } - - options.formData[param.name] = attachment - }) - } else { - if (req.postData.text) { - options.body = req.postData.text - } - } - - return options -} - -exports.Har = Har - -},{"extend":81,"fs":undefined,"har-validator":150,"querystring":undefined}],135:[function(require,module,exports){ -'use strict' - -var jsonSafeStringify = require('json-stringify-safe') -var crypto = require('crypto') -var Buffer = require('safe-buffer').Buffer - -var defer = typeof setImmediate === 'undefined' - ? process.nextTick - : setImmediate - -function paramsHaveRequestBody (params) { - return ( - params.body || - params.requestBodyStream || - (params.json && typeof params.json !== 'boolean') || - params.multipart - ) -} - -function safeStringify (obj, replacer) { - var ret - try { - ret = JSON.stringify(obj, replacer) - } catch (e) { - ret = jsonSafeStringify(obj, replacer) - } - return ret -} - -function md5 (str) { - return crypto.createHash('md5').update(str).digest('hex') -} - -function isReadStream (rs) { - return rs.readable && rs.path && rs.mode -} - -function toBase64 (str) { - return Buffer.from(str || '', 'utf8').toString('base64') -} - -function copy (obj) { - var o = {} - Object.keys(obj).forEach(function (i) { - o[i] = obj[i] - }) - return o -} - -function version () { - var numbers = process.version.replace('v', '').split('.') - return { - major: parseInt(numbers[0], 10), - minor: parseInt(numbers[1], 10), - patch: parseInt(numbers[2], 10) - } -} - -exports.paramsHaveRequestBody = paramsHaveRequestBody -exports.safeStringify = safeStringify -exports.md5 = md5 -exports.isReadStream = isReadStream -exports.toBase64 = toBase64 -exports.copy = copy -exports.version = version -exports.defer = defer - -},{"crypto":undefined,"json-stringify-safe":116,"safe-buffer":181}],136:[function(require,module,exports){ -'use strict' - -var uuid = require('uuid') -var CombinedStream = require('combined-stream') -var isstream = require('isstream') -var Buffer = require('safe-buffer').Buffer - -function Multipart (request) { - this.request = request - this.boundary = uuid() - this.chunked = false - this.body = null -} - -Multipart.prototype.isChunked = function (options) { - var self = this - var chunked = false - var parts = options.data || options - - if (!parts.forEach) { - self.request.emit('error', new Error('Argument error, options.multipart.')) - } - - if (options.chunked !== undefined) { - chunked = options.chunked - } - - if (self.request.getHeader('transfer-encoding') === 'chunked') { - chunked = true - } - - if (!chunked) { - parts.forEach(function (part) { - if (typeof part.body === 'undefined') { - self.request.emit('error', new Error('Body attribute missing in multipart.')) - } - if (isstream(part.body)) { - chunked = true - } - }) - } - - return chunked -} - -Multipart.prototype.setHeaders = function (chunked) { - var self = this - - if (chunked && !self.request.hasHeader('transfer-encoding')) { - self.request.setHeader('transfer-encoding', 'chunked') - } - - var header = self.request.getHeader('content-type') - - if (!header || header.indexOf('multipart') === -1) { - self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) - } else { - if (header.indexOf('boundary') !== -1) { - self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1') - } else { - self.request.setHeader('content-type', header + '; boundary=' + self.boundary) - } - } -} - -Multipart.prototype.build = function (parts, chunked) { - var self = this - var body = chunked ? new CombinedStream() : [] - - function add (part) { - if (typeof part === 'number') { - part = part.toString() - } - return chunked ? body.append(part) : body.push(Buffer.from(part)) - } - - if (self.request.preambleCRLF) { - add('\r\n') - } - - parts.forEach(function (part) { - var preamble = '--' + self.boundary + '\r\n' - Object.keys(part).forEach(function (key) { - if (key === 'body') { return } - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n' - add(preamble) - add(part.body) - add('\r\n') - }) - add('--' + self.boundary + '--') - - if (self.request.postambleCRLF) { - add('\r\n') - } - - return body -} - -Multipart.prototype.onRequest = function (options) { - var self = this - - var chunked = self.isChunked(options) - var parts = options.data || options - - self.setHeaders(chunked) - self.chunked = chunked - self.body = self.build(parts, chunked) -} - -exports.Multipart = Multipart - -},{"combined-stream":74,"isstream":112,"safe-buffer":181,"uuid":209}],137:[function(require,module,exports){ -'use strict' - -var url = require('url') -var qs = require('qs') -var caseless = require('caseless') -var uuid = require('uuid') -var oauth = require('oauth-sign') -var crypto = require('crypto') -var Buffer = require('safe-buffer').Buffer - -function OAuth (request) { - this.request = request - this.params = null -} - -OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) { - var oa = {} - for (var i in _oauth) { - oa['oauth_' + i] = _oauth[i] - } - if (!oa.oauth_version) { - oa.oauth_version = '1.0' - } - if (!oa.oauth_timestamp) { - oa.oauth_timestamp = Math.floor(Date.now() / 1000).toString() - } - if (!oa.oauth_nonce) { - oa.oauth_nonce = uuid().replace(/-/g, '') - } - if (!oa.oauth_signature_method) { - oa.oauth_signature_method = 'HMAC-SHA1' - } - - var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key // eslint-disable-line camelcase - delete oa.oauth_consumer_secret - delete oa.oauth_private_key - - var token_secret = oa.oauth_token_secret // eslint-disable-line camelcase - delete oa.oauth_token_secret - - var realm = oa.oauth_realm - delete oa.oauth_realm - delete oa.oauth_transport_method - - var baseurl = uri.protocol + '//' + uri.host + uri.pathname - var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&')) - - oa.oauth_signature = oauth.sign( - oa.oauth_signature_method, - method, - baseurl, - params, - consumer_secret_or_private_key, // eslint-disable-line camelcase - token_secret // eslint-disable-line camelcase - ) - - if (realm) { - oa.realm = realm - } - - return oa -} - -OAuth.prototype.buildBodyHash = function (_oauth, body) { - if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) { - this.request.emit('error', new Error('oauth: ' + _oauth.signature_method + - ' signature_method not supported with body_hash signing.')) - } - - var shasum = crypto.createHash('sha1') - shasum.update(body || '') - var sha1 = shasum.digest('hex') - - return Buffer.from(sha1).toString('base64') -} - -OAuth.prototype.concatParams = function (oa, sep, wrap) { - wrap = wrap || '' - - var params = Object.keys(oa).filter(function (i) { - return i !== 'realm' && i !== 'oauth_signature' - }).sort() - - if (oa.realm) { - params.splice(0, 0, 'realm') - } - params.push('oauth_signature') - - return params.map(function (i) { - return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap - }).join(sep) -} - -OAuth.prototype.onRequest = function (_oauth) { - var self = this - self.params = _oauth - - var uri = self.request.uri || {} - var method = self.request.method || '' - var headers = caseless(self.request.headers) - var body = self.request.body || '' - var qsLib = self.request.qsLib || qs - - var form - var query - var contentType = headers.get('content-type') || '' - var formContentType = 'application/x-www-form-urlencoded' - var transport = _oauth.transport_method || 'header' - - if (contentType.slice(0, formContentType.length) === formContentType) { - contentType = formContentType - form = body - } - if (uri.query) { - query = uri.query - } - if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) { - self.request.emit('error', new Error('oauth: transport_method of body requires POST ' + - 'and content-type ' + formContentType)) - } - - if (!form && typeof _oauth.body_hash === 'boolean') { - _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString()) - } - - var oa = self.buildParams(_oauth, uri, method, query, form, qsLib) - - switch (transport) { - case 'header': - self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"')) - break - - case 'query': - var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&') - self.request.uri = url.parse(href) - self.request.path = self.request.uri.path - break - - case 'body': - self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&') - break - - default: - self.request.emit('error', new Error('oauth: transport_method invalid')) - } -} - -exports.OAuth = OAuth - -},{"caseless":144,"crypto":undefined,"oauth-sign":122,"qs":165,"safe-buffer":181,"url":undefined,"uuid":209}],138:[function(require,module,exports){ -'use strict' - -var qs = require('qs') -var querystring = require('querystring') - -function Querystring (request) { - this.request = request - this.lib = null - this.useQuerystring = null - this.parseOptions = null - this.stringifyOptions = null -} - -Querystring.prototype.init = function (options) { - if (this.lib) { return } - - this.useQuerystring = options.useQuerystring - this.lib = (this.useQuerystring ? querystring : qs) - - this.parseOptions = options.qsParseOptions || {} - this.stringifyOptions = options.qsStringifyOptions || {} -} - -Querystring.prototype.stringify = function (obj) { - return (this.useQuerystring) - ? this.rfc3986(this.lib.stringify(obj, - this.stringifyOptions.sep || null, - this.stringifyOptions.eq || null, - this.stringifyOptions)) - : this.lib.stringify(obj, this.stringifyOptions) -} - -Querystring.prototype.parse = function (str) { - return (this.useQuerystring) - ? this.lib.parse(str, - this.parseOptions.sep || null, - this.parseOptions.eq || null, - this.parseOptions) - : this.lib.parse(str, this.parseOptions) -} - -Querystring.prototype.rfc3986 = function (str) { - return str.replace(/[!'()*]/g, function (c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase() - }) -} - -Querystring.prototype.unescape = querystring.unescape - -exports.Querystring = Querystring - -},{"qs":165,"querystring":undefined}],139:[function(require,module,exports){ -'use strict' - -var url = require('url') -var isUrl = /^https?:/ - -function Redirect (request) { - this.request = request - this.followRedirect = true - this.followRedirects = true - this.followAllRedirects = false - this.followOriginalHttpMethod = false - this.allowRedirect = function () { return true } - this.maxRedirects = 10 - this.redirects = [] - this.redirectsFollowed = 0 - this.removeRefererHeader = false -} - -Redirect.prototype.onRequest = function (options) { - var self = this - - if (options.maxRedirects !== undefined) { - self.maxRedirects = options.maxRedirects - } - if (typeof options.followRedirect === 'function') { - self.allowRedirect = options.followRedirect - } - if (options.followRedirect !== undefined) { - self.followRedirects = !!options.followRedirect - } - if (options.followAllRedirects !== undefined) { - self.followAllRedirects = options.followAllRedirects - } - if (self.followRedirects || self.followAllRedirects) { - self.redirects = self.redirects || [] - } - if (options.removeRefererHeader !== undefined) { - self.removeRefererHeader = options.removeRefererHeader - } - if (options.followOriginalHttpMethod !== undefined) { - self.followOriginalHttpMethod = options.followOriginalHttpMethod - } -} - -Redirect.prototype.redirectTo = function (response) { - var self = this - var request = self.request - - var redirectTo = null - if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) { - var location = response.caseless.get('location') - request.debug('redirect', location) - - if (self.followAllRedirects) { - redirectTo = location - } else if (self.followRedirects) { - switch (request.method) { - case 'PATCH': - case 'PUT': - case 'POST': - case 'DELETE': - // Do not follow redirects - break - default: - redirectTo = location - break - } - } - } else if (response.statusCode === 401) { - var authHeader = request._auth.onResponse(response) - if (authHeader) { - request.setHeader('authorization', authHeader) - redirectTo = request.uri - } - } - return redirectTo -} - -Redirect.prototype.onResponse = function (response) { - var self = this - var request = self.request - - var redirectTo = self.redirectTo(response) - if (!redirectTo || !self.allowRedirect.call(request, response)) { - return false - } - - request.debug('redirect to', redirectTo) - - // ignore any potential response body. it cannot possibly be useful - // to us at this point. - // response.resume should be defined, but check anyway before calling. Workaround for browserify. - if (response.resume) { - response.resume() - } - - if (self.redirectsFollowed >= self.maxRedirects) { - request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href)) - return false - } - self.redirectsFollowed += 1 - - if (!isUrl.test(redirectTo)) { - redirectTo = url.resolve(request.uri.href, redirectTo) - } - - var uriPrev = request.uri - request.uri = url.parse(redirectTo) - - // handle the case where we change protocol from https to http or vice versa - if (request.uri.protocol !== uriPrev.protocol) { - delete request.agent - } - - self.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo }) - - if (self.followAllRedirects && request.method !== 'HEAD' && - response.statusCode !== 401 && response.statusCode !== 307) { - request.method = self.followOriginalHttpMethod ? request.method : 'GET' - } - // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215 - delete request.src - delete request.req - delete request._started - if (response.statusCode !== 401 && response.statusCode !== 307) { - // Remove parameters from the previous response, unless this is the second request - // for a server that requires digest authentication. - delete request.body - delete request._form - if (request.headers) { - request.removeHeader('host') - request.removeHeader('content-type') - request.removeHeader('content-length') - if (request.uri.hostname !== request.originalHost.split(':')[0]) { - // Remove authorization if changing hostnames (but not if just - // changing ports or protocols). This matches the behavior of curl: - // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710 - request.removeHeader('authorization') - } - } - } - - if (!self.removeRefererHeader) { - request.setHeader('referer', uriPrev.href) - } - - request.emit('redirect') - - request.init() - - return true -} - -exports.Redirect = Redirect - -},{"url":undefined}],140:[function(require,module,exports){ -'use strict' - -var url = require('url') -var tunnel = require('tunnel-agent') - -var defaultProxyHeaderWhiteList = [ - 'accept', - 'accept-charset', - 'accept-encoding', - 'accept-language', - 'accept-ranges', - 'cache-control', - 'content-encoding', - 'content-language', - 'content-location', - 'content-md5', - 'content-range', - 'content-type', - 'connection', - 'date', - 'expect', - 'max-forwards', - 'pragma', - 'referer', - 'te', - 'user-agent', - 'via' -] - -var defaultProxyHeaderExclusiveList = [ - 'proxy-authorization' -] - -function constructProxyHost (uriObject) { - var port = uriObject.port - var protocol = uriObject.protocol - var proxyHost = uriObject.hostname + ':' - - if (port) { - proxyHost += port - } else if (protocol === 'https:') { - proxyHost += '443' - } else { - proxyHost += '80' - } - - return proxyHost -} - -function constructProxyHeaderWhiteList (headers, proxyHeaderWhiteList) { - var whiteList = proxyHeaderWhiteList - .reduce(function (set, header) { - set[header.toLowerCase()] = true - return set - }, {}) - - return Object.keys(headers) - .filter(function (header) { - return whiteList[header.toLowerCase()] - }) - .reduce(function (set, header) { - set[header] = headers[header] - return set - }, {}) -} - -function constructTunnelOptions (request, proxyHeaders) { - var proxy = request.proxy - - var tunnelOptions = { - proxy: { - host: proxy.hostname, - port: +proxy.port, - proxyAuth: proxy.auth, - headers: proxyHeaders - }, - headers: request.headers, - ca: request.ca, - cert: request.cert, - key: request.key, - passphrase: request.passphrase, - pfx: request.pfx, - ciphers: request.ciphers, - rejectUnauthorized: request.rejectUnauthorized, - secureOptions: request.secureOptions, - secureProtocol: request.secureProtocol - } - - return tunnelOptions -} - -function constructTunnelFnName (uri, proxy) { - var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http') - var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http') - return [uriProtocol, proxyProtocol].join('Over') -} - -function getTunnelFn (request) { - var uri = request.uri - var proxy = request.proxy - var tunnelFnName = constructTunnelFnName(uri, proxy) - return tunnel[tunnelFnName] -} - -function Tunnel (request) { - this.request = request - this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList - this.proxyHeaderExclusiveList = [] - if (typeof request.tunnel !== 'undefined') { - this.tunnelOverride = request.tunnel - } -} - -Tunnel.prototype.isEnabled = function () { - var self = this - var request = self.request - // Tunnel HTTPS by default. Allow the user to override this setting. - - // If self.tunnelOverride is set (the user specified a value), use it. - if (typeof self.tunnelOverride !== 'undefined') { - return self.tunnelOverride - } - - // If the destination is HTTPS, tunnel. - if (request.uri.protocol === 'https:') { - return true - } - - // Otherwise, do not use tunnel. - return false -} - -Tunnel.prototype.setup = function (options) { - var self = this - var request = self.request - - options = options || {} - - if (typeof request.proxy === 'string') { - request.proxy = url.parse(request.proxy) - } - - if (!request.proxy || !request.tunnel) { - return false - } - - // Setup Proxy Header Exclusive List and White List - if (options.proxyHeaderWhiteList) { - self.proxyHeaderWhiteList = options.proxyHeaderWhiteList - } - if (options.proxyHeaderExclusiveList) { - self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList - } - - var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList) - var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList) - - // Setup Proxy Headers and Proxy Headers Host - // Only send the Proxy White Listed Header names - var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList) - proxyHeaders.host = constructProxyHost(request.uri) - - proxyHeaderExclusiveList.forEach(request.removeHeader, request) - - // Set Agent from Tunnel Data - var tunnelFn = getTunnelFn(request) - var tunnelOptions = constructTunnelOptions(request, proxyHeaders) - request.agent = tunnelFn(tunnelOptions) - - return true -} - -Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList -Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList -exports.Tunnel = Tunnel - -},{"tunnel-agent":177,"url":undefined}],141:[function(require,module,exports){ -arguments[4][118][0].apply(exports,arguments) -},{"assert":undefined,"dup":118,"stream":undefined,"util":undefined}],142:[function(require,module,exports){ - -/*! - * Copyright 2010 LearnBoost - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Module dependencies. - */ - -var crypto = require('crypto') - , parse = require('url').parse - ; - -/** - * Valid keys. - */ - -var keys = - [ 'acl' - , 'location' - , 'logging' - , 'notification' - , 'partNumber' - , 'policy' - , 'requestPayment' - , 'torrent' - , 'uploadId' - , 'uploads' - , 'versionId' - , 'versioning' - , 'versions' - , 'website' - ] - -/** - * Return an "Authorization" header value with the given `options` - * in the form of "AWS :" - * - * @param {Object} options - * @return {String} - * @api private - */ - -function authorization (options) { - return 'AWS ' + options.key + ':' + sign(options) -} - -module.exports = authorization -module.exports.authorization = authorization - -/** - * Simple HMAC-SHA1 Wrapper - * - * @param {Object} options - * @return {String} - * @api private - */ - -function hmacSha1 (options) { - return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') -} - -module.exports.hmacSha1 = hmacSha1 - -/** - * Create a base64 sha1 HMAC for `options`. - * - * @param {Object} options - * @return {String} - * @api private - */ - -function sign (options) { - options.message = stringToSign(options) - return hmacSha1(options) -} -module.exports.sign = sign - -/** - * Create a base64 sha1 HMAC for `options`. - * - * Specifically to be used with S3 presigned URLs - * - * @param {Object} options - * @return {String} - * @api private - */ - -function signQuery (options) { - options.message = queryStringToSign(options) - return hmacSha1(options) -} -module.exports.signQuery= signQuery - -/** - * Return a string for sign() with the given `options`. - * - * Spec: - * - * \n - * \n - * \n - * \n - * [headers\n] - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -function stringToSign (options) { - var headers = options.amazonHeaders || '' - if (headers) headers += '\n' - var r = - [ options.verb - , options.md5 - , options.contentType - , options.date ? options.date.toUTCString() : '' - , headers + options.resource - ] - return r.join('\n') -} -module.exports.stringToSign = stringToSign - -/** - * Return a string for sign() with the given `options`, but is meant exclusively - * for S3 presigned URLs - * - * Spec: - * - * \n - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -function queryStringToSign (options){ - return 'GET\n\n\n' + options.date + '\n' + options.resource -} -module.exports.queryStringToSign = queryStringToSign - -/** - * Perform the following: - * - * - ignore non-amazon headers - * - lowercase fields - * - sort lexicographically - * - trim whitespace between ":" - * - join with newline - * - * @param {Object} headers - * @return {String} - * @api private - */ - -function canonicalizeHeaders (headers) { - var buf = [] - , fields = Object.keys(headers) - ; - for (var i = 0, len = fields.length; i < len; ++i) { - var field = fields[i] - , val = headers[field] - , field = field.toLowerCase() - ; - if (0 !== field.indexOf('x-amz')) continue - buf.push(field + ':' + val) - } - return buf.sort().join('\n') -} -module.exports.canonicalizeHeaders = canonicalizeHeaders - -/** - * Perform the following: - * - * - ignore non sub-resources - * - sort lexicographically - * - * @param {String} resource - * @return {String} - * @api private - */ - -function canonicalizeResource (resource) { - var url = parse(resource, true) - , path = url.pathname - , buf = [] - ; - - Object.keys(url.query).forEach(function(key){ - if (!~keys.indexOf(key)) return - var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) - buf.push(key + val) - }) - - return path + (buf.length ? '?' + buf.sort().join('&') : '') -} -module.exports.canonicalizeResource = canonicalizeResource - -},{"crypto":undefined,"url":undefined}],143:[function(require,module,exports){ -'use strict'; - -// Load modules - -const Hoek = require('hoek'); - - -// Declare internals - -const internals = { - STATUS_CODES: Object.setPrototypeOf({ - '100': 'Continue', - '101': 'Switching Protocols', - '102': 'Processing', - '200': 'OK', - '201': 'Created', - '202': 'Accepted', - '203': 'Non-Authoritative Information', - '204': 'No Content', - '205': 'Reset Content', - '206': 'Partial Content', - '207': 'Multi-Status', - '300': 'Multiple Choices', - '301': 'Moved Permanently', - '302': 'Moved Temporarily', - '303': 'See Other', - '304': 'Not Modified', - '305': 'Use Proxy', - '307': 'Temporary Redirect', - '400': 'Bad Request', - '401': 'Unauthorized', - '402': 'Payment Required', - '403': 'Forbidden', - '404': 'Not Found', - '405': 'Method Not Allowed', - '406': 'Not Acceptable', - '407': 'Proxy Authentication Required', - '408': 'Request Time-out', - '409': 'Conflict', - '410': 'Gone', - '411': 'Length Required', - '412': 'Precondition Failed', - '413': 'Request Entity Too Large', - '414': 'Request-URI Too Large', - '415': 'Unsupported Media Type', - '416': 'Requested Range Not Satisfiable', - '417': 'Expectation Failed', - '418': 'I\'m a teapot', - '422': 'Unprocessable Entity', - '423': 'Locked', - '424': 'Failed Dependency', - '425': 'Unordered Collection', - '426': 'Upgrade Required', - '428': 'Precondition Required', - '429': 'Too Many Requests', - '431': 'Request Header Fields Too Large', - '451': 'Unavailable For Legal Reasons', - '500': 'Internal Server Error', - '501': 'Not Implemented', - '502': 'Bad Gateway', - '503': 'Service Unavailable', - '504': 'Gateway Time-out', - '505': 'HTTP Version Not Supported', - '506': 'Variant Also Negotiates', - '507': 'Insufficient Storage', - '509': 'Bandwidth Limit Exceeded', - '510': 'Not Extended', - '511': 'Network Authentication Required' - }, null) -}; - - -exports.wrap = function (error, statusCode, message) { - - Hoek.assert(error instanceof Error, 'Cannot wrap non-Error object'); - Hoek.assert(!error.isBoom || (!statusCode && !message), 'Cannot provide statusCode or message with boom error'); - - return (error.isBoom ? error : internals.initialize(error, statusCode || 500, message)); -}; - - -exports.create = function (statusCode, message, data) { - - return internals.create(statusCode, message, data, exports.create); -}; - - -internals.create = function (statusCode, message, data, ctor) { - - if (message instanceof Error) { - if (data) { - message.data = data; - } - return exports.wrap(message, statusCode); - } - - const error = new Error(message ? message : undefined); // Avoids settings null message - Error.captureStackTrace(error, ctor); // Filter the stack to our external API - error.data = data || null; - internals.initialize(error, statusCode); - return error; -}; - - -internals.initialize = function (error, statusCode, message) { - - const numberCode = parseInt(statusCode, 10); - Hoek.assert(!isNaN(numberCode) && numberCode >= 400, 'First argument must be a number (400+):', statusCode); - - error.isBoom = true; - error.isServer = numberCode >= 500; - - if (!error.hasOwnProperty('data')) { - error.data = null; - } - - error.output = { - statusCode: numberCode, - payload: {}, - headers: {} - }; - - error.reformat = internals.reformat; - error.reformat(); - - if (!message && - !error.message) { - - message = error.output.payload.error; - } - - if (message) { - error.message = (message + (error.message ? ': ' + error.message : '')); - } - - return error; -}; - - -internals.reformat = function () { - - this.output.payload.statusCode = this.output.statusCode; - this.output.payload.error = internals.STATUS_CODES[this.output.statusCode] || 'Unknown'; - - if (this.output.statusCode === 500) { - this.output.payload.message = 'An internal server error occurred'; // Hide actual error from user - } - else if (this.message) { - this.output.payload.message = this.message; - } -}; - - -// 4xx Client Errors - -exports.badRequest = function (message, data) { - - return internals.create(400, message, data, exports.badRequest); -}; - - -exports.unauthorized = function (message, scheme, attributes) { // Or function (message, wwwAuthenticate[]) - - const err = internals.create(401, message, undefined, exports.unauthorized); - - if (!scheme) { - return err; - } - - let wwwAuthenticate = ''; - - if (typeof scheme === 'string') { - - // function (message, scheme, attributes) - - wwwAuthenticate = scheme; - - if (attributes || message) { - err.output.payload.attributes = {}; - } - - if (attributes) { - if (typeof attributes === 'string') { - wwwAuthenticate = wwwAuthenticate + ' ' + Hoek.escapeHeaderAttribute(attributes); - err.output.payload.attributes = attributes; - } - else { - const names = Object.keys(attributes); - for (let i = 0; i < names.length; ++i) { - const name = names[i]; - if (i) { - wwwAuthenticate = wwwAuthenticate + ','; - } - - let value = attributes[name]; - if (value === null || - value === undefined) { // Value can be zero - - value = ''; - } - wwwAuthenticate = wwwAuthenticate + ' ' + name + '="' + Hoek.escapeHeaderAttribute(value.toString()) + '"'; - err.output.payload.attributes[name] = value; - } - } - } - - - if (message) { - if (attributes) { - wwwAuthenticate = wwwAuthenticate + ','; - } - wwwAuthenticate = wwwAuthenticate + ' error="' + Hoek.escapeHeaderAttribute(message) + '"'; - err.output.payload.attributes.error = message; - } - else { - err.isMissing = true; - } - } - else { - - // function (message, wwwAuthenticate[]) - - const wwwArray = scheme; - for (let i = 0; i < wwwArray.length; ++i) { - if (i) { - wwwAuthenticate = wwwAuthenticate + ', '; - } - - wwwAuthenticate = wwwAuthenticate + wwwArray[i]; - } - } - - err.output.headers['WWW-Authenticate'] = wwwAuthenticate; - - return err; -}; - - -exports.paymentRequired = function (message, data) { - - return internals.create(402, message, data, exports.paymentRequired); -}; - - -exports.forbidden = function (message, data) { - - return internals.create(403, message, data, exports.forbidden); -}; - - -exports.notFound = function (message, data) { - - return internals.create(404, message, data, exports.notFound); -}; - - -exports.methodNotAllowed = function (message, data, allow) { - - const err = internals.create(405, message, data, exports.methodNotAllowed); - - if (typeof allow === 'string') { - allow = [allow]; - } - - if (Array.isArray(allow)) { - err.output.headers.Allow = allow.join(', '); - } - - return err; -}; - - -exports.notAcceptable = function (message, data) { - - return internals.create(406, message, data, exports.notAcceptable); -}; - - -exports.proxyAuthRequired = function (message, data) { - - return internals.create(407, message, data, exports.proxyAuthRequired); -}; - - -exports.clientTimeout = function (message, data) { - - return internals.create(408, message, data, exports.clientTimeout); -}; - - -exports.conflict = function (message, data) { - - return internals.create(409, message, data, exports.conflict); -}; - - -exports.resourceGone = function (message, data) { - - return internals.create(410, message, data, exports.resourceGone); -}; - - -exports.lengthRequired = function (message, data) { - - return internals.create(411, message, data, exports.lengthRequired); -}; - - -exports.preconditionFailed = function (message, data) { - - return internals.create(412, message, data, exports.preconditionFailed); -}; - - -exports.entityTooLarge = function (message, data) { - - return internals.create(413, message, data, exports.entityTooLarge); -}; - - -exports.uriTooLong = function (message, data) { - - return internals.create(414, message, data, exports.uriTooLong); -}; - - -exports.unsupportedMediaType = function (message, data) { - - return internals.create(415, message, data, exports.unsupportedMediaType); -}; - - -exports.rangeNotSatisfiable = function (message, data) { - - return internals.create(416, message, data, exports.rangeNotSatisfiable); -}; - - -exports.expectationFailed = function (message, data) { - - return internals.create(417, message, data, exports.expectationFailed); -}; - - -exports.teapot = function (message, data) { - - return internals.create(418, message, data, exports.teapot); -}; - - -exports.badData = function (message, data) { - - return internals.create(422, message, data, exports.badData); -}; - - -exports.locked = function (message, data) { - - return internals.create(423, message, data, exports.locked); -}; - - -exports.preconditionRequired = function (message, data) { - - return internals.create(428, message, data, exports.preconditionRequired); -}; - - -exports.tooManyRequests = function (message, data) { - - return internals.create(429, message, data, exports.tooManyRequests); -}; - - -exports.illegal = function (message, data) { - - return internals.create(451, message, data, exports.illegal); -}; - - -// 5xx Server Errors - -exports.internal = function (message, data, statusCode) { - - return internals.serverError(message, data, statusCode, exports.internal); -}; - - -internals.serverError = function (message, data, statusCode, ctor) { - - let error; - if (data instanceof Error) { - error = exports.wrap(data, statusCode, message); - } - else { - error = internals.create(statusCode || 500, message, undefined, ctor); - error.data = data; - } - - return error; -}; - - -exports.notImplemented = function (message, data) { - - return internals.serverError(message, data, 501, exports.notImplemented); -}; - - -exports.badGateway = function (message, data) { - - return internals.serverError(message, data, 502, exports.badGateway); -}; - - -exports.serverUnavailable = function (message, data) { - - return internals.serverError(message, data, 503, exports.serverUnavailable); -}; - - -exports.gatewayTimeout = function (message, data) { - - return internals.serverError(message, data, 504, exports.gatewayTimeout); -}; - - -exports.badImplementation = function (message, data) { - - const err = internals.serverError(message, data, 500, exports.badImplementation); - err.isDeveloperError = true; - return err; -}; - -},{"hoek":158}],144:[function(require,module,exports){ -function Caseless (dict) { - this.dict = dict || {} -} -Caseless.prototype.set = function (name, value, clobber) { - if (typeof name === 'object') { - for (var i in name) { - this.set(i, name[i], value) - } - } else { - if (typeof clobber === 'undefined') clobber = true - var has = this.has(name) - - if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value - else this.dict[has || name] = value - return has - } -} -Caseless.prototype.has = function (name) { - var keys = Object.keys(this.dict) - , name = name.toLowerCase() - ; - for (var i=0;i= 400, 'First argument must be a number (400+):', statusCode); - - error.isBoom = true; - error.isServer = numberCode >= 500; - - if (!error.hasOwnProperty('data')) { - error.data = null; - } - - error.output = { - statusCode: numberCode, - payload: {}, - headers: {} - }; - - error.reformat = internals.reformat; - - if (!message && - !error.message) { - - error.reformat(); - message = error.output.payload.error; - } - - if (message) { - error.message = (message + (error.message ? ': ' + error.message : '')); - error.output.payload.message = error.message; - } - - error.reformat(); - return error; -}; - - -internals.reformat = function () { - - this.output.payload.statusCode = this.output.statusCode; - this.output.payload.error = internals.STATUS_CODES[this.output.statusCode] || 'Unknown'; - - if (this.output.statusCode === 500) { - this.output.payload.message = 'An internal server error occurred'; // Hide actual error from user - } - else if (this.message) { - this.output.payload.message = this.message; - } -}; - - -// 4xx Client Errors - -exports.badRequest = function (message, data) { - - return internals.create(400, message, data, exports.badRequest); -}; - - -exports.unauthorized = function (message, scheme, attributes) { // Or function (message, wwwAuthenticate[]) - - const err = internals.create(401, message, undefined, exports.unauthorized); - - if (!scheme) { - return err; - } - - let wwwAuthenticate = ''; - - if (typeof scheme === 'string') { - - // function (message, scheme, attributes) - - wwwAuthenticate = scheme; - - if (attributes || message) { - err.output.payload.attributes = {}; - } - - if (attributes) { - if (typeof attributes === 'string') { - wwwAuthenticate = wwwAuthenticate + ' ' + Hoek.escapeHeaderAttribute(attributes); - err.output.payload.attributes = attributes; - } - else { - const names = Object.keys(attributes); - for (let i = 0; i < names.length; ++i) { - const name = names[i]; - if (i) { - wwwAuthenticate = wwwAuthenticate + ','; - } - - let value = attributes[name]; - if (value === null || - value === undefined) { // Value can be zero - - value = ''; - } - wwwAuthenticate = wwwAuthenticate + ' ' + name + '="' + Hoek.escapeHeaderAttribute(value.toString()) + '"'; - err.output.payload.attributes[name] = value; - } - } - } - - - if (message) { - if (attributes) { - wwwAuthenticate = wwwAuthenticate + ','; - } - wwwAuthenticate = wwwAuthenticate + ' error="' + Hoek.escapeHeaderAttribute(message) + '"'; - err.output.payload.attributes.error = message; - } - else { - err.isMissing = true; - } - } - else { - - // function (message, wwwAuthenticate[]) - - const wwwArray = scheme; - for (let i = 0; i < wwwArray.length; ++i) { - if (i) { - wwwAuthenticate = wwwAuthenticate + ', '; - } - - wwwAuthenticate = wwwAuthenticate + wwwArray[i]; - } - } - - err.output.headers['WWW-Authenticate'] = wwwAuthenticate; - - return err; -}; - - -exports.paymentRequired = function (message, data) { - - return internals.create(402, message, data, exports.paymentRequired); -}; - - -exports.forbidden = function (message, data) { - - return internals.create(403, message, data, exports.forbidden); -}; - - -exports.notFound = function (message, data) { - - return internals.create(404, message, data, exports.notFound); -}; - - -exports.methodNotAllowed = function (message, data, allow) { - - const err = internals.create(405, message, data, exports.methodNotAllowed); - - if (typeof allow === 'string') { - allow = [allow]; - } - - if (Array.isArray(allow)) { - err.output.headers.Allow = allow.join(', '); - } - - return err; -}; - - -exports.notAcceptable = function (message, data) { - - return internals.create(406, message, data, exports.notAcceptable); -}; - - -exports.proxyAuthRequired = function (message, data) { - - return internals.create(407, message, data, exports.proxyAuthRequired); -}; - - -exports.clientTimeout = function (message, data) { - - return internals.create(408, message, data, exports.clientTimeout); -}; - - -exports.conflict = function (message, data) { - - return internals.create(409, message, data, exports.conflict); -}; - - -exports.resourceGone = function (message, data) { - - return internals.create(410, message, data, exports.resourceGone); -}; - - -exports.lengthRequired = function (message, data) { - - return internals.create(411, message, data, exports.lengthRequired); -}; - - -exports.preconditionFailed = function (message, data) { - - return internals.create(412, message, data, exports.preconditionFailed); -}; - - -exports.entityTooLarge = function (message, data) { - - return internals.create(413, message, data, exports.entityTooLarge); -}; - - -exports.uriTooLong = function (message, data) { - - return internals.create(414, message, data, exports.uriTooLong); -}; - - -exports.unsupportedMediaType = function (message, data) { - - return internals.create(415, message, data, exports.unsupportedMediaType); -}; - - -exports.rangeNotSatisfiable = function (message, data) { - - return internals.create(416, message, data, exports.rangeNotSatisfiable); -}; - - -exports.expectationFailed = function (message, data) { - - return internals.create(417, message, data, exports.expectationFailed); -}; - - -exports.teapot = function (message, data) { - - return internals.create(418, message, data, exports.teapot); -}; - - -exports.badData = function (message, data) { - - return internals.create(422, message, data, exports.badData); -}; - - -exports.locked = function (message, data) { - - return internals.create(423, message, data, exports.locked); -}; - - -exports.preconditionRequired = function (message, data) { - - return internals.create(428, message, data, exports.preconditionRequired); -}; - - -exports.tooManyRequests = function (message, data) { - - return internals.create(429, message, data, exports.tooManyRequests); -}; - - -exports.illegal = function (message, data) { - - return internals.create(451, message, data, exports.illegal); -}; - - -// 5xx Server Errors - -exports.internal = function (message, data, statusCode) { - - return internals.serverError(message, data, statusCode, exports.internal); -}; - - -internals.serverError = function (message, data, statusCode, ctor) { - - if (data instanceof Error && - !data.isBoom) { - - return exports.wrap(data, statusCode, message); - } - - const error = internals.create(statusCode || 500, message, undefined, ctor); - error.data = data; - return error; -}; - - -exports.notImplemented = function (message, data) { - - return internals.serverError(message, data, 501, exports.notImplemented); -}; - - -exports.badGateway = function (message, data) { - - return internals.serverError(message, data, 502, exports.badGateway); -}; - - -exports.serverUnavailable = function (message, data) { - - return internals.serverError(message, data, 503, exports.serverUnavailable); -}; - - -exports.gatewayTimeout = function (message, data) { - - return internals.serverError(message, data, 504, exports.gatewayTimeout); -}; - - -exports.badImplementation = function (message, data) { - - const err = internals.serverError(message, data, 500, exports.badImplementation); - err.isDeveloperError = true; - return err; -}; - -},{"hoek":158}],147:[function(require,module,exports){ -var CombinedStream = require('combined-stream'); -var util = require('util'); -var path = require('path'); -var http = require('http'); -var https = require('https'); -var parseUrl = require('url').parse; -var fs = require('fs'); -var mime = require('mime-types'); -var asynckit = require('asynckit'); -var populate = require('./populate.js'); - -// Public API -module.exports = FormData; - -// make it a Stream -util.inherits(FormData, CombinedStream); - -/** - * Create readable "multipart/form-data" streams. - * Can be used to submit forms - * and file uploads to other web applications. - * - * @constructor - * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream - */ -function FormData(options) { - if (!(this instanceof FormData)) { - return new FormData(); - } - - this._overheadLength = 0; - this._valueLength = 0; - this._valuesToMeasure = []; - - CombinedStream.call(this); - - options = options || {}; - for (var option in options) { - this[option] = options[option]; - } -} - -FormData.LINE_BREAK = '\r\n'; -FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream'; - -FormData.prototype.append = function(field, value, options) { - - options = options || {}; - - // allow filename as single option - if (typeof options == 'string') { - options = {filename: options}; - } - - var append = CombinedStream.prototype.append.bind(this); - - // all that streamy business can't handle numbers - if (typeof value == 'number') { - value = '' + value; - } - - // https://github.com/felixge/node-form-data/issues/38 - if (util.isArray(value)) { - // Please convert your array into string - // the way web server expects it - this._error(new Error('Arrays are not supported.')); - return; - } - - var header = this._multiPartHeader(field, value, options); - var footer = this._multiPartFooter(); - - append(header); - append(value); - append(footer); - - // pass along options.knownLength - this._trackLength(header, value, options); -}; - -FormData.prototype._trackLength = function(header, value, options) { - var valueLength = 0; - - // used w/ getLengthSync(), when length is known. - // e.g. for streaming directly from a remote server, - // w/ a known file a size, and not wanting to wait for - // incoming file to finish to get its size. - if (options.knownLength != null) { - valueLength += +options.knownLength; - } else if (Buffer.isBuffer(value)) { - valueLength = value.length; - } else if (typeof value === 'string') { - valueLength = Buffer.byteLength(value); - } - - this._valueLength += valueLength; - - // @check why add CRLF? does this account for custom/multiple CRLFs? - this._overheadLength += - Buffer.byteLength(header) + - FormData.LINE_BREAK.length; - - // empty or either doesn't have path or not an http response - if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) )) { - return; - } - - // no need to bother with the length - if (!options.knownLength) { - this._valuesToMeasure.push(value); - } -}; - -FormData.prototype._lengthRetriever = function(value, callback) { - - if (value.hasOwnProperty('fd')) { - - // take read range into a account - // `end` = Infinity –> read file till the end - // - // TODO: Looks like there is bug in Node fs.createReadStream - // it doesn't respect `end` options without `start` options - // Fix it when node fixes it. - // https://github.com/joyent/node/issues/7819 - if (value.end != undefined && value.end != Infinity && value.start != undefined) { - - // when end specified - // no need to calculate range - // inclusive, starts with 0 - callback(null, value.end + 1 - (value.start ? value.start : 0)); - - // not that fast snoopy - } else { - // still need to fetch file size from fs - fs.stat(value.path, function(err, stat) { - - var fileSize; - - if (err) { - callback(err); - return; - } - - // update final size based on the range options - fileSize = stat.size - (value.start ? value.start : 0); - callback(null, fileSize); - }); - } - - // or http response - } else if (value.hasOwnProperty('httpVersion')) { - callback(null, +value.headers['content-length']); - - // or request stream http://github.com/mikeal/request - } else if (value.hasOwnProperty('httpModule')) { - // wait till response come back - value.on('response', function(response) { - value.pause(); - callback(null, +response.headers['content-length']); - }); - value.resume(); - - // something else - } else { - callback('Unknown stream'); - } -}; - -FormData.prototype._multiPartHeader = function(field, value, options) { - // custom header specified (as string)? - // it becomes responsible for boundary - // (e.g. to handle extra CRLFs on .NET servers) - if (typeof options.header == 'string') { - return options.header; - } - - var contentDisposition = this._getContentDisposition(value, options); - var contentType = this._getContentType(value, options); - - var contents = ''; - var headers = { - // add custom disposition as third element or keep it two elements if not - 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []), - // if no content type. allow it to be empty array - 'Content-Type': [].concat(contentType || []) - }; - - // allow custom headers. - if (typeof options.header == 'object') { - populate(headers, options.header); - } - - var header; - for (var prop in headers) { - if (!headers.hasOwnProperty(prop)) continue; - header = headers[prop]; - - // skip nullish headers. - if (header == null) { - continue; - } - - // convert all headers to arrays. - if (!Array.isArray(header)) { - header = [header]; - } - - // add non-empty headers. - if (header.length) { - contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; - } - } - - return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK; -}; - -FormData.prototype._getContentDisposition = function(value, options) { - - var filename - , contentDisposition - ; - - if (typeof options.filepath === 'string') { - // custom filepath for relative paths - filename = path.normalize(options.filepath).replace(/\\/g, '/'); - } else if (options.filename || value.name || value.path) { - // custom filename take precedence - // formidable and the browser add a name property - // fs- and request- streams have path property - filename = path.basename(options.filename || value.name || value.path); - } else if (value.readable && value.hasOwnProperty('httpVersion')) { - // or try http response - filename = path.basename(value.client._httpMessage.path); - } - - if (filename) { - contentDisposition = 'filename="' + filename + '"'; - } - - return contentDisposition; -}; - -FormData.prototype._getContentType = function(value, options) { - - // use custom content-type above all - var contentType = options.contentType; - - // or try `name` from formidable, browser - if (!contentType && value.name) { - contentType = mime.lookup(value.name); - } - - // or try `path` from fs-, request- streams - if (!contentType && value.path) { - contentType = mime.lookup(value.path); - } - - // or if it's http-reponse - if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) { - contentType = value.headers['content-type']; - } - - // or guess it from the filepath or filename - if (!contentType && (options.filepath || options.filename)) { - contentType = mime.lookup(options.filepath || options.filename); - } - - // fallback to the default content type if `value` is not simple value - if (!contentType && typeof value == 'object') { - contentType = FormData.DEFAULT_CONTENT_TYPE; - } - - return contentType; -}; - -FormData.prototype._multiPartFooter = function() { - return function(next) { - var footer = FormData.LINE_BREAK; - - var lastPart = (this._streams.length === 0); - if (lastPart) { - footer += this._lastBoundary(); - } - - next(footer); - }.bind(this); -}; - -FormData.prototype._lastBoundary = function() { - return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK; -}; - -FormData.prototype.getHeaders = function(userHeaders) { - var header; - var formHeaders = { - 'content-type': 'multipart/form-data; boundary=' + this.getBoundary() - }; - - for (header in userHeaders) { - if (userHeaders.hasOwnProperty(header)) { - formHeaders[header.toLowerCase()] = userHeaders[header]; - } - } - - return formHeaders; -}; - -FormData.prototype.getBoundary = function() { - if (!this._boundary) { - this._generateBoundary(); - } - - return this._boundary; -}; - -FormData.prototype._generateBoundary = function() { - // This generates a 50 character boundary similar to those used by Firefox. - // They are optimized for boyer-moore parsing. - var boundary = '--------------------------'; - for (var i = 0; i < 24; i++) { - boundary += Math.floor(Math.random() * 10).toString(16); - } - - this._boundary = boundary; -}; - -// Note: getLengthSync DOESN'T calculate streams length -// As workaround one can calculate file size manually -// and add it as knownLength option -FormData.prototype.getLengthSync = function() { - var knownLength = this._overheadLength + this._valueLength; - - // Don't get confused, there are 3 "internal" streams for each keyval pair - // so it basically checks if there is any value added to the form - if (this._streams.length) { - knownLength += this._lastBoundary().length; - } - - // https://github.com/form-data/form-data/issues/40 - if (!this.hasKnownLength()) { - // Some async length retrievers are present - // therefore synchronous length calculation is false. - // Please use getLength(callback) to get proper length - this._error(new Error('Cannot calculate proper length in synchronous way.')); - } - - return knownLength; -}; - -// Public API to check if length of added values is known -// https://github.com/form-data/form-data/issues/196 -// https://github.com/form-data/form-data/issues/262 -FormData.prototype.hasKnownLength = function() { - var hasKnownLength = true; - - if (this._valuesToMeasure.length) { - hasKnownLength = false; - } - - return hasKnownLength; -}; - -FormData.prototype.getLength = function(cb) { - var knownLength = this._overheadLength + this._valueLength; - - if (this._streams.length) { - knownLength += this._lastBoundary().length; - } - - if (!this._valuesToMeasure.length) { - process.nextTick(cb.bind(this, null, knownLength)); - return; - } - - asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) { - if (err) { - cb(err); - return; - } - - values.forEach(function(length) { - knownLength += length; - }); - - cb(null, knownLength); - }); -}; - -FormData.prototype.submit = function(params, cb) { - var request - , options - , defaults = {method: 'post'} - ; - - // parse provided url if it's string - // or treat it as options object - if (typeof params == 'string') { - - params = parseUrl(params); - options = populate({ - port: params.port, - path: params.pathname, - host: params.hostname, - protocol: params.protocol - }, defaults); - - // use custom params - } else { - - options = populate(params, defaults); - // if no port provided use default one - if (!options.port) { - options.port = options.protocol == 'https:' ? 443 : 80; - } - } - - // put that good code in getHeaders to some use - options.headers = this.getHeaders(params.headers); - - // https if specified, fallback to http in any other case - if (options.protocol == 'https:') { - request = https.request(options); - } else { - request = http.request(options); - } - - // get content length and fire away - this.getLength(function(err, length) { - if (err) { - this._error(err); - return; - } - - // add content length - request.setHeader('Content-Length', length); - - this.pipe(request); - if (cb) { - request.on('error', cb); - request.on('response', cb.bind(this, null)); - } - }.bind(this)); - - return request; -}; - -FormData.prototype._error = function(err) { - if (!this.error) { - this.error = err; - this.pause(); - this.emit('error', err); - } -}; - -FormData.prototype.toString = function () { - return '[object FormData]'; -}; - -},{"./populate.js":148,"asynckit":60,"combined-stream":74,"fs":undefined,"http":undefined,"https":undefined,"mime-types":121,"path":undefined,"url":undefined,"util":undefined}],148:[function(require,module,exports){ -// populates missing values -module.exports = function(dst, src) { - - Object.keys(src).forEach(function(prop) - { - dst[prop] = dst[prop] || src[prop]; - }); - - return dst; -}; - -},{}],149:[function(require,module,exports){ -function HARError (errors) { - var message = 'validation failed' - - this.name = 'HARError' - this.message = message - this.errors = errors - - if (typeof Error.captureStackTrace === 'function') { - Error.captureStackTrace(this, this.constructor) - } else { - this.stack = (new Error(message)).stack - } -} - -HARError.prototype = Error.prototype - -module.exports = HARError - -},{}],150:[function(require,module,exports){ -var Ajv = require('ajv') -var HARError = require('./error') -var schemas = require('har-schema') - -var ajv - -function validate (name, data) { - data = data || {} - - // validator config - ajv = ajv || new Ajv({ - allErrors: true, - schemas: schemas - }) - - var validate = ajv.getSchema(name + '.json') - - return new Promise(function (resolve, reject) { - var valid = validate(data) - - !valid ? reject(new HARError(validate.errors)) : resolve(data) - }) -} - -exports.afterRequest = function (data) { - return validate('afterRequest', data) -} - -exports.beforeRequest = function (data) { - return validate('beforeRequest', data) -} - -exports.browser = function (data) { - return validate('browser', data) -} - -exports.cache = function (data) { - return validate('cache', data) -} - -exports.content = function (data) { - return validate('content', data) -} - -exports.cookie = function (data) { - return validate('cookie', data) -} - -exports.creator = function (data) { - return validate('creator', data) -} - -exports.entry = function (data) { - return validate('entry', data) -} - -exports.har = function (data) { - return validate('har', data) -} - -exports.header = function (data) { - return validate('header', data) -} - -exports.log = function (data) { - return validate('log', data) -} - -exports.page = function (data) { - return validate('page', data) -} - -exports.pageTimings = function (data) { - return validate('pageTimings', data) -} - -exports.postData = function (data) { - return validate('postData', data) -} - -exports.query = function (data) { - return validate('query', data) -} - -exports.request = function (data) { - return validate('request', data) -} - -exports.response = function (data) { - return validate('response', data) -} - -exports.timings = function (data) { - return validate('timings', data) -} - -},{"./error":149,"ajv":15,"har-schema":96}],151:[function(require,module,exports){ -'use strict'; - -// Load modules - -const Url = require('url'); -const Hoek = require('hoek'); -const Cryptiles = require('cryptiles'); -const Crypto = require('./crypto'); -const Utils = require('./utils'); - - -// Declare internals - -const internals = {}; - - -// Generate an Authorization header for a given request - -/* - uri: 'http://example.com/resource?a=b' or object from Url.parse() - method: HTTP verb (e.g. 'GET', 'POST') - options: { - - // Required - - credentials: { - id: 'dh37fgj492je', - key: 'aoijedoaijsdlaksjdl', - algorithm: 'sha256' // 'sha1', 'sha256' - }, - - // Optional - - ext: 'application-specific', // Application specific data sent via the ext attribute - timestamp: Date.now() / 1000, // A pre-calculated timestamp in seconds - nonce: '2334f34f', // A pre-generated nonce - localtimeOffsetMsec: 400, // Time offset to sync with server time (ignored if timestamp provided) - payload: '{"some":"payload"}', // UTF-8 encoded string for body hash generation (ignored if hash provided) - contentType: 'application/json', // Payload content-type (ignored if hash provided) - hash: 'U4MKKSmiVxk37JCCrAVIjV=', // Pre-calculated payload hash - app: '24s23423f34dx', // Oz application id - dlg: '234sz34tww3sd' // Oz delegated-by application id - } -*/ - -exports.header = function (uri, method, options) { - - const result = { - field: '', - artifacts: {} - }; - - // Validate inputs - - if (!uri || (typeof uri !== 'string' && typeof uri !== 'object') || - !method || typeof method !== 'string' || - !options || typeof options !== 'object') { - - result.err = 'Invalid argument type'; - return result; - } - - // Application time - - const timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec); - - // Validate credentials - - const credentials = options.credentials; - if (!credentials || - !credentials.id || - !credentials.key || - !credentials.algorithm) { - - result.err = 'Invalid credential object'; - return result; - } - - if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) { - result.err = 'Unknown algorithm'; - return result; - } - - // Parse URI - - if (typeof uri === 'string') { - uri = Url.parse(uri); - } - - // Calculate signature - - const artifacts = { - ts: timestamp, - nonce: options.nonce || Cryptiles.randomString(6), - method, - resource: uri.pathname + (uri.search || ''), // Maintain trailing '?' - host: uri.hostname, - port: uri.port || (uri.protocol === 'http:' ? 80 : 443), - hash: options.hash, - ext: options.ext, - app: options.app, - dlg: options.dlg - }; - - result.artifacts = artifacts; - - // Calculate payload hash - - if (!artifacts.hash && - (options.payload || options.payload === '')) { - - artifacts.hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType); - } - - const mac = Crypto.calculateMac('header', credentials, artifacts); - - // Construct header - - const hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== ''; // Other falsey values allowed - let header = 'Hawk id="' + credentials.id + - '", ts="' + artifacts.ts + - '", nonce="' + artifacts.nonce + - (artifacts.hash ? '", hash="' + artifacts.hash : '') + - (hasExt ? '", ext="' + Hoek.escapeHeaderAttribute(artifacts.ext) : '') + - '", mac="' + mac + '"'; - - if (artifacts.app) { - header = header + ', app="' + artifacts.app + - (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"'; - } - - result.field = header; - - return result; -}; - - -// Validate server response - -/* - res: node's response object - artifacts: object received from header().artifacts - options: { - payload: optional payload received - required: specifies if a Server-Authorization header is required. Defaults to 'false' - } -*/ - -exports.authenticate = function (res, credentials, artifacts, options, callback) { - - artifacts = Hoek.clone(artifacts); - options = options || {}; - - let wwwAttributes = null; - let serverAuthAttributes = null; - - const finalize = function (err) { - - if (callback) { - const headers = { - 'www-authenticate': wwwAttributes, - 'server-authorization': serverAuthAttributes - }; - - return callback(err, headers); - } - - return !err; - }; - - if (res.headers['www-authenticate']) { - - // Parse HTTP WWW-Authenticate header - - wwwAttributes = Utils.parseAuthorizationHeader(res.headers['www-authenticate'], ['ts', 'tsm', 'error']); - if (wwwAttributes instanceof Error) { - wwwAttributes = null; - return finalize(new Error('Invalid WWW-Authenticate header')); - } - - // Validate server timestamp (not used to update clock since it is done via the SNPT client) - - if (wwwAttributes.ts) { - const tsm = Crypto.calculateTsMac(wwwAttributes.ts, credentials); - if (tsm !== wwwAttributes.tsm) { - return finalize(new Error('Invalid server timestamp hash')); - } - } - } - - // Parse HTTP Server-Authorization header - - if (!res.headers['server-authorization'] && - !options.required) { - - return finalize(); - } - - serverAuthAttributes = Utils.parseAuthorizationHeader(res.headers['server-authorization'], ['mac', 'ext', 'hash']); - if (serverAuthAttributes instanceof Error) { - serverAuthAttributes = null; - return finalize(new Error('Invalid Server-Authorization header')); - } - - artifacts.ext = serverAuthAttributes.ext; - artifacts.hash = serverAuthAttributes.hash; - - const mac = Crypto.calculateMac('response', credentials, artifacts); - if (mac !== serverAuthAttributes.mac) { - return finalize(new Error('Bad response mac')); - } - - if (!options.payload && - options.payload !== '') { - - return finalize(); - } - - if (!serverAuthAttributes.hash) { - return finalize(new Error('Missing response hash attribute')); - } - - const calculatedHash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, res.headers['content-type']); - if (calculatedHash !== serverAuthAttributes.hash) { - return finalize(new Error('Bad response payload mac')); - } - - return finalize(); -}; - - -// Generate a bewit value for a given URI - -/* - uri: 'http://example.com/resource?a=b' or object from Url.parse() - options: { - - // Required - - credentials: { - id: 'dh37fgj492je', - key: 'aoijedoaijsdlaksjdl', - algorithm: 'sha256' // 'sha1', 'sha256' - }, - ttlSec: 60 * 60, // TTL in seconds - - // Optional - - ext: 'application-specific', // Application specific data sent via the ext attribute - localtimeOffsetMsec: 400 // Time offset to sync with server time - }; -*/ - -exports.getBewit = function (uri, options) { - - // Validate inputs - - if (!uri || - (typeof uri !== 'string' && typeof uri !== 'object') || - !options || - typeof options !== 'object' || - !options.ttlSec) { - - return ''; - } - - options.ext = (options.ext === null || options.ext === undefined ? '' : options.ext); // Zero is valid value - - // Application time - - const now = Utils.now(options.localtimeOffsetMsec); - - // Validate credentials - - const credentials = options.credentials; - if (!credentials || - !credentials.id || - !credentials.key || - !credentials.algorithm) { - - return ''; - } - - if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) { - return ''; - } - - // Parse URI - - if (typeof uri === 'string') { - uri = Url.parse(uri); - } - - // Calculate signature - - const exp = Math.floor(now / 1000) + options.ttlSec; - const mac = Crypto.calculateMac('bewit', credentials, { - ts: exp, - nonce: '', - method: 'GET', - resource: uri.pathname + (uri.search || ''), // Maintain trailing '?' - host: uri.hostname, - port: uri.port || (uri.protocol === 'http:' ? 80 : 443), - ext: options.ext - }); - - // Construct bewit: id\exp\mac\ext - - const bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + options.ext; - return Hoek.base64urlEncode(bewit); -}; - - -// Generate an authorization string for a message - -/* - host: 'example.com', - port: 8000, - message: '{"some":"payload"}', // UTF-8 encoded string for body hash generation - options: { - - // Required - - credentials: { - id: 'dh37fgj492je', - key: 'aoijedoaijsdlaksjdl', - algorithm: 'sha256' // 'sha1', 'sha256' - }, - - // Optional - - timestamp: Date.now() / 1000, // A pre-calculated timestamp in seconds - nonce: '2334f34f', // A pre-generated nonce - localtimeOffsetMsec: 400, // Time offset to sync with server time (ignored if timestamp provided) - } -*/ - -exports.message = function (host, port, message, options) { - - // Validate inputs - - if (!host || typeof host !== 'string' || - !port || typeof port !== 'number' || - message === null || message === undefined || typeof message !== 'string' || - !options || typeof options !== 'object') { - - return null; - } - - // Application time - - const timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec); - - // Validate credentials - - const credentials = options.credentials; - if (!credentials || - !credentials.id || - !credentials.key || - !credentials.algorithm) { - - // Invalid credential object - return null; - } - - if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) { - return null; - } - - // Calculate signature - - const artifacts = { - ts: timestamp, - nonce: options.nonce || Cryptiles.randomString(6), - host, - port, - hash: Crypto.calculatePayloadHash(message, credentials.algorithm) - }; - - // Construct authorization - - const result = { - id: credentials.id, - ts: artifacts.ts, - nonce: artifacts.nonce, - hash: artifacts.hash, - mac: Crypto.calculateMac('message', credentials, artifacts) - }; - - return result; -}; - - - - -},{"./crypto":152,"./utils":155,"cryptiles":145,"hoek":158,"url":undefined}],152:[function(require,module,exports){ -'use strict'; - -// Load modules - -const Crypto = require('crypto'); -const Url = require('url'); -const Utils = require('./utils'); - - -// Declare internals - -const internals = {}; - - -// MAC normalization format version - -exports.headerVersion = '1'; // Prevent comparison of mac values generated with different normalized string formats - - -// Supported HMAC algorithms - -exports.algorithms = ['sha1', 'sha256']; - - -// Calculate the request MAC - -/* - type: 'header', // 'header', 'bewit', 'response' - credentials: { - key: 'aoijedoaijsdlaksjdl', - algorithm: 'sha256' // 'sha1', 'sha256' - }, - options: { - method: 'GET', - resource: '/resource?a=1&b=2', - host: 'example.com', - port: 8080, - ts: 1357718381034, - nonce: 'd3d345f', - hash: 'U4MKKSmiVxk37JCCrAVIjV/OhB3y+NdwoCr6RShbVkE=', - ext: 'app-specific-data', - app: 'hf48hd83qwkj', // Application id (Oz) - dlg: 'd8djwekds9cj' // Delegated by application id (Oz), requires options.app - } -*/ - -exports.calculateMac = function (type, credentials, options) { - - const normalized = exports.generateNormalizedString(type, options); - - const hmac = Crypto.createHmac(credentials.algorithm, credentials.key).update(normalized); - const digest = hmac.digest('base64'); - return digest; -}; - - -exports.generateNormalizedString = function (type, options) { - - let resource = options.resource || ''; - if (resource && - resource[0] !== '/') { - - const url = Url.parse(resource, false); - resource = url.path; // Includes query - } - - let normalized = 'hawk.' + exports.headerVersion + '.' + type + '\n' + - options.ts + '\n' + - options.nonce + '\n' + - (options.method || '').toUpperCase() + '\n' + - resource + '\n' + - options.host.toLowerCase() + '\n' + - options.port + '\n' + - (options.hash || '') + '\n'; - - if (options.ext) { - normalized = normalized + options.ext.replace('\\', '\\\\').replace('\n', '\\n'); - } - - normalized = normalized + '\n'; - - if (options.app) { - normalized = normalized + options.app + '\n' + - (options.dlg || '') + '\n'; - } - - return normalized; -}; - - -exports.calculatePayloadHash = function (payload, algorithm, contentType) { - - const hash = exports.initializePayloadHash(algorithm, contentType); - hash.update(payload || ''); - return exports.finalizePayloadHash(hash); -}; - - -exports.initializePayloadHash = function (algorithm, contentType) { - - const hash = Crypto.createHash(algorithm); - hash.update('hawk.' + exports.headerVersion + '.payload\n'); - hash.update(Utils.parseContentType(contentType) + '\n'); - return hash; -}; - - -exports.finalizePayloadHash = function (hash) { - - hash.update('\n'); - return hash.digest('base64'); -}; - - -exports.calculateTsMac = function (ts, credentials) { - - const hmac = Crypto.createHmac(credentials.algorithm, credentials.key); - hmac.update('hawk.' + exports.headerVersion + '.ts\n' + ts + '\n'); - return hmac.digest('base64'); -}; - - -exports.timestampMessage = function (credentials, localtimeOffsetMsec) { - - const now = Utils.nowSecs(localtimeOffsetMsec); - const tsm = exports.calculateTsMac(now, credentials); - return { ts: now, tsm }; -}; - -},{"./utils":155,"crypto":undefined,"url":undefined}],153:[function(require,module,exports){ -'use strict'; - -// Export sub-modules - -exports.error = exports.Error = require('boom'); -exports.sntp = require('sntp'); - -exports.server = require('./server'); -exports.client = require('./client'); -exports.crypto = require('./crypto'); -exports.utils = require('./utils'); - -exports.uri = { - authenticate: exports.server.authenticateBewit, - getBewit: exports.client.getBewit -}; - - -},{"./client":151,"./crypto":152,"./server":154,"./utils":155,"boom":143,"sntp":169}],154:[function(require,module,exports){ -'use strict'; - -// Load modules - -const Boom = require('boom'); -const Hoek = require('hoek'); -const Cryptiles = require('cryptiles'); -const Crypto = require('./crypto'); -const Utils = require('./utils'); - - -// Declare internals - -const internals = {}; - - -// Hawk authentication - -/* - req: node's HTTP request object or an object as follows: - - const request = { - method: 'GET', - url: '/resource/4?a=1&b=2', - host: 'example.com', - port: 8080, - authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", ext="some-app-ext-data", mac="6R4rV5iE+NPoym+WwjeHzjAGXUtLNIxmo1vpMofpLAE="' - }; - - credentialsFunc: required function to lookup the set of Hawk credentials based on the provided credentials id. - The credentials include the MAC key, MAC algorithm, and other attributes (such as username) - needed by the application. This function is the equivalent of verifying the username and - password in Basic authentication. - - const credentialsFunc = function (id, callback) { - - // Lookup credentials in database - db.lookup(id, function (err, item) { - - if (err || !item) { - return callback(err); - } - - const credentials = { - // Required - key: item.key, - algorithm: item.algorithm, - // Application specific - user: item.user - }; - - return callback(null, credentials); - }); - }; - - options: { - - hostHeaderName: optional header field name, used to override the default 'Host' header when used - behind a cache of a proxy. Apache2 changes the value of the 'Host' header while preserving - the original (which is what the module must verify) in the 'x-forwarded-host' header field. - Only used when passed a node Http.ServerRequest object. - - nonceFunc: optional nonce validation function. The function signature is function(key, nonce, ts, callback) - where 'callback' must be called using the signature function(err). - - timestampSkewSec: optional number of seconds of permitted clock skew for incoming timestamps. Defaults to 60 seconds. - Provides a +/- skew which means actual allowed window is double the number of seconds. - - localtimeOffsetMsec: optional local clock time offset express in a number of milliseconds (positive or negative). - Defaults to 0. - - payload: optional payload for validation. The client calculates the hash value and includes it via the 'hash' - header attribute. The server always ensures the value provided has been included in the request - MAC. When this option is provided, it validates the hash value itself. Validation is done by calculating - a hash value over the entire payload (assuming it has already be normalized to the same format and - encoding used by the client to calculate the hash on request). If the payload is not available at the time - of authentication, the authenticatePayload() method can be used by passing it the credentials and - attributes.hash returned in the authenticate callback. - - host: optional host name override. Only used when passed a node request object. - port: optional port override. Only used when passed a node request object. - } - - callback: function (err, credentials, artifacts) { } - */ - -exports.authenticate = function (req, credentialsFunc, options, callback) { - - callback = Hoek.nextTick(callback); - - // Default options - - options.nonceFunc = options.nonceFunc || internals.nonceFunc; - options.timestampSkewSec = options.timestampSkewSec || 60; // 60 seconds - - // Application time - - const now = Utils.now(options.localtimeOffsetMsec); // Measure now before any other processing - - // Convert node Http request object to a request configuration object - - const request = Utils.parseRequest(req, options); - if (request instanceof Error) { - return callback(Boom.badRequest(request.message)); - } - - // Parse HTTP Authorization header - - const attributes = Utils.parseAuthorizationHeader(request.authorization); - if (attributes instanceof Error) { - return callback(attributes); - } - - // Construct artifacts container - - const artifacts = { - method: request.method, - host: request.host, - port: request.port, - resource: request.url, - ts: attributes.ts, - nonce: attributes.nonce, - hash: attributes.hash, - ext: attributes.ext, - app: attributes.app, - dlg: attributes.dlg, - mac: attributes.mac, - id: attributes.id - }; - - // Verify required header attributes - - if (!attributes.id || - !attributes.ts || - !attributes.nonce || - !attributes.mac) { - - return callback(Boom.badRequest('Missing attributes'), null, artifacts); - } - - // Fetch Hawk credentials - - credentialsFunc(attributes.id, (err, credentials) => { - - if (err) { - return callback(err, credentials || null, artifacts); - } - - if (!credentials) { - return callback(Utils.unauthorized('Unknown credentials'), null, artifacts); - } - - if (!credentials.key || - !credentials.algorithm) { - - return callback(Boom.internal('Invalid credentials'), credentials, artifacts); - } - - if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) { - return callback(Boom.internal('Unknown algorithm'), credentials, artifacts); - } - - // Calculate MAC - - const mac = Crypto.calculateMac('header', credentials, artifacts); - if (!Cryptiles.fixedTimeComparison(mac, attributes.mac)) { - return callback(Utils.unauthorized('Bad mac'), credentials, artifacts); - } - - // Check payload hash - - if (options.payload || - options.payload === '') { - - if (!attributes.hash) { - return callback(Utils.unauthorized('Missing required payload hash'), credentials, artifacts); - } - - const hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, request.contentType); - if (!Cryptiles.fixedTimeComparison(hash, attributes.hash)) { - return callback(Utils.unauthorized('Bad payload hash'), credentials, artifacts); - } - } - - // Check nonce - - options.nonceFunc(credentials.key, attributes.nonce, attributes.ts, (err) => { - - if (err) { - return callback(Utils.unauthorized('Invalid nonce'), credentials, artifacts); - } - - // Check timestamp staleness - - if (Math.abs((attributes.ts * 1000) - now) > (options.timestampSkewSec * 1000)) { - const tsm = Crypto.timestampMessage(credentials, options.localtimeOffsetMsec); - return callback(Utils.unauthorized('Stale timestamp', tsm), credentials, artifacts); - } - - // Successful authentication - - return callback(null, credentials, artifacts); - }); - }); -}; - - -// Authenticate payload hash - used when payload cannot be provided during authenticate() - -/* - payload: raw request payload - credentials: from authenticate callback - artifacts: from authenticate callback - contentType: req.headers['content-type'] -*/ - -exports.authenticatePayload = function (payload, credentials, artifacts, contentType) { - - const calculatedHash = Crypto.calculatePayloadHash(payload, credentials.algorithm, contentType); - return Cryptiles.fixedTimeComparison(calculatedHash, artifacts.hash); -}; - - -// Authenticate payload hash - used when payload cannot be provided during authenticate() - -/* - calculatedHash: the payload hash calculated using Crypto.calculatePayloadHash() - artifacts: from authenticate callback -*/ - -exports.authenticatePayloadHash = function (calculatedHash, artifacts) { - - return Cryptiles.fixedTimeComparison(calculatedHash, artifacts.hash); -}; - - -// Generate a Server-Authorization header for a given response - -/* - credentials: {}, // Object received from authenticate() - artifacts: {} // Object received from authenticate(); 'mac', 'hash', and 'ext' - ignored - options: { - ext: 'application-specific', // Application specific data sent via the ext attribute - payload: '{"some":"payload"}', // UTF-8 encoded string for body hash generation (ignored if hash provided) - contentType: 'application/json', // Payload content-type (ignored if hash provided) - hash: 'U4MKKSmiVxk37JCCrAVIjV=' // Pre-calculated payload hash - } -*/ - -exports.header = function (credentials, artifacts, options) { - - // Prepare inputs - - options = options || {}; - - if (!artifacts || - typeof artifacts !== 'object' || - typeof options !== 'object') { - - return ''; - } - - artifacts = Hoek.clone(artifacts); - delete artifacts.mac; - artifacts.hash = options.hash; - artifacts.ext = options.ext; - - // Validate credentials - - if (!credentials || - !credentials.key || - !credentials.algorithm) { - - // Invalid credential object - return ''; - } - - if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) { - return ''; - } - - // Calculate payload hash - - if (!artifacts.hash && - (options.payload || options.payload === '')) { - - artifacts.hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType); - } - - const mac = Crypto.calculateMac('response', credentials, artifacts); - - // Construct header - - let header = 'Hawk mac="' + mac + '"' + - (artifacts.hash ? ', hash="' + artifacts.hash + '"' : ''); - - if (artifacts.ext !== null && - artifacts.ext !== undefined && - artifacts.ext !== '') { // Other falsey values allowed - - header = header + ', ext="' + Hoek.escapeHeaderAttribute(artifacts.ext) + '"'; - } - - return header; -}; - - -/* - * Arguments and options are the same as authenticate() with the exception that the only supported options are: - * 'hostHeaderName', 'localtimeOffsetMsec', 'host', 'port' - */ - - -// 1 2 3 4 -internals.bewitRegex = /^(\/.*)([\?&])bewit\=([^&$]*)(?:&(.+))?$/; - - -exports.authenticateBewit = function (req, credentialsFunc, options, callback) { - - callback = Hoek.nextTick(callback); - - // Application time - - const now = Utils.now(options.localtimeOffsetMsec); - - // Convert node Http request object to a request configuration object - - const request = Utils.parseRequest(req, options); - if (request instanceof Error) { - return callback(Boom.badRequest(request.message)); - } - - // Extract bewit - - if (request.url.length > Utils.limits.maxMatchLength) { - return callback(Boom.badRequest('Resource path exceeds max length')); - } - - const resource = request.url.match(internals.bewitRegex); - if (!resource) { - return callback(Utils.unauthorized()); - } - - // Bewit not empty - - if (!resource[3]) { - return callback(Utils.unauthorized('Empty bewit')); - } - - // Verify method is GET - - if (request.method !== 'GET' && - request.method !== 'HEAD') { - - return callback(Utils.unauthorized('Invalid method')); - } - - // No other authentication - - if (request.authorization) { - return callback(Boom.badRequest('Multiple authentications')); - } - - // Parse bewit - - const bewitString = Hoek.base64urlDecode(resource[3]); - if (bewitString instanceof Error) { - return callback(Boom.badRequest('Invalid bewit encoding')); - } - - // Bewit format: id\exp\mac\ext ('\' is used because it is a reserved header attribute character) - - const bewitParts = bewitString.split('\\'); - if (bewitParts.length !== 4) { - return callback(Boom.badRequest('Invalid bewit structure')); - } - - const bewit = { - id: bewitParts[0], - exp: parseInt(bewitParts[1], 10), - mac: bewitParts[2], - ext: bewitParts[3] || '' - }; - - if (!bewit.id || - !bewit.exp || - !bewit.mac) { - - return callback(Boom.badRequest('Missing bewit attributes')); - } - - // Construct URL without bewit - - let url = resource[1]; - if (resource[4]) { - url = url + resource[2] + resource[4]; - } - - // Check expiration - - if (bewit.exp * 1000 <= now) { - return callback(Utils.unauthorized('Access expired'), null, bewit); - } - - // Fetch Hawk credentials - - credentialsFunc(bewit.id, (err, credentials) => { - - if (err) { - return callback(err, credentials || null, bewit.ext); - } - - if (!credentials) { - return callback(Utils.unauthorized('Unknown credentials'), null, bewit); - } - - if (!credentials.key || - !credentials.algorithm) { - - return callback(Boom.internal('Invalid credentials'), credentials, bewit); - } - - if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) { - return callback(Boom.internal('Unknown algorithm'), credentials, bewit); - } - - // Calculate MAC - - const mac = Crypto.calculateMac('bewit', credentials, { - ts: bewit.exp, - nonce: '', - method: 'GET', - resource: url, - host: request.host, - port: request.port, - ext: bewit.ext - }); - - if (!Cryptiles.fixedTimeComparison(mac, bewit.mac)) { - return callback(Utils.unauthorized('Bad mac'), credentials, bewit); - } - - // Successful authentication - - return callback(null, credentials, bewit); - }); -}; - - -/* - * options are the same as authenticate() with the exception that the only supported options are: - * 'nonceFunc', 'timestampSkewSec', 'localtimeOffsetMsec' - */ - -exports.authenticateMessage = function (host, port, message, authorization, credentialsFunc, options, callback) { - - callback = Hoek.nextTick(callback); - - // Default options - - options.nonceFunc = options.nonceFunc || internals.nonceFunc; - options.timestampSkewSec = options.timestampSkewSec || 60; // 60 seconds - - // Application time - - const now = Utils.now(options.localtimeOffsetMsec); // Measure now before any other processing - - // Validate authorization - - if (!authorization.id || - !authorization.ts || - !authorization.nonce || - !authorization.hash || - !authorization.mac) { - - return callback(Boom.badRequest('Invalid authorization')); - } - - // Fetch Hawk credentials - - credentialsFunc(authorization.id, (err, credentials) => { - - if (err) { - return callback(err, credentials || null); - } - - if (!credentials) { - return callback(Utils.unauthorized('Unknown credentials')); - } - - if (!credentials.key || - !credentials.algorithm) { - - return callback(Boom.internal('Invalid credentials'), credentials); - } - - if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) { - return callback(Boom.internal('Unknown algorithm'), credentials); - } - - // Construct artifacts container - - const artifacts = { - ts: authorization.ts, - nonce: authorization.nonce, - host, - port, - hash: authorization.hash - }; - - // Calculate MAC - - const mac = Crypto.calculateMac('message', credentials, artifacts); - if (!Cryptiles.fixedTimeComparison(mac, authorization.mac)) { - return callback(Utils.unauthorized('Bad mac'), credentials); - } - - // Check payload hash - - const hash = Crypto.calculatePayloadHash(message, credentials.algorithm); - if (!Cryptiles.fixedTimeComparison(hash, authorization.hash)) { - return callback(Utils.unauthorized('Bad message hash'), credentials); - } - - // Check nonce - - options.nonceFunc(credentials.key, authorization.nonce, authorization.ts, (err) => { - - if (err) { - return callback(Utils.unauthorized('Invalid nonce'), credentials); - } - - // Check timestamp staleness - - if (Math.abs((authorization.ts * 1000) - now) > (options.timestampSkewSec * 1000)) { - return callback(Utils.unauthorized('Stale timestamp'), credentials); - } - - // Successful authentication - - return callback(null, credentials); - }); - }); -}; - - -internals.nonceFunc = function (key, nonce, ts, nonceCallback) { - - return nonceCallback(); // No validation -}; - -},{"./crypto":152,"./utils":155,"boom":143,"cryptiles":145,"hoek":158}],155:[function(require,module,exports){ -'use strict'; - -// Load modules - -const Sntp = require('sntp'); -const Boom = require('boom'); - - -// Declare internals - -const internals = {}; - - -exports.version = function () { - - return require('../package.json').version; -}; - - -exports.limits = { - maxMatchLength: 4096 // Limit the length of uris and headers to avoid a DoS attack on string matching -}; - - -// Extract host and port from request - -// $1 $2 -internals.hostHeaderRegex = /^(?:(?:\r\n)?\s)*((?:[^:]+)|(?:\[[^\]]+\]))(?::(\d+))?(?:(?:\r\n)?\s)*$/; // (IPv4, hostname)|(IPv6) - - -exports.parseHost = function (req, hostHeaderName) { - - hostHeaderName = (hostHeaderName ? hostHeaderName.toLowerCase() : 'host'); - const hostHeader = req.headers[hostHeaderName]; - if (!hostHeader) { - return null; - } - - if (hostHeader.length > exports.limits.maxMatchLength) { - return null; - } - - const hostParts = hostHeader.match(internals.hostHeaderRegex); - if (!hostParts) { - return null; - } - - return { - name: hostParts[1], - port: (hostParts[2] ? hostParts[2] : (req.connection && req.connection.encrypted ? 443 : 80)) - }; -}; - - -// Parse Content-Type header content - -exports.parseContentType = function (header) { - - if (!header) { - return ''; - } - - return header.split(';')[0].trim().toLowerCase(); -}; - - -// Convert node's to request configuration object - -exports.parseRequest = function (req, options) { - - if (!req.headers) { - return req; - } - - // Obtain host and port information - - let host; - if (!options.host || - !options.port) { - - host = exports.parseHost(req, options.hostHeaderName); - if (!host) { - return new Error('Invalid Host header'); - } - } - - const request = { - method: req.method, - url: req.url, - host: options.host || host.name, - port: options.port || host.port, - authorization: req.headers.authorization, - contentType: req.headers['content-type'] || '' - }; - - return request; -}; - - -exports.now = function (localtimeOffsetMsec) { - - return Sntp.now() + (localtimeOffsetMsec || 0); -}; - - -exports.nowSecs = function (localtimeOffsetMsec) { - - return Math.floor(exports.now(localtimeOffsetMsec) / 1000); -}; - - -internals.authHeaderRegex = /^(\w+)(?:\s+(.*))?$/; // Header: scheme[ something] -internals.attributeRegex = /^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~]+$/; // !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9 - - -// Parse Hawk HTTP Authorization header - -exports.parseAuthorizationHeader = function (header, keys) { - - keys = keys || ['id', 'ts', 'nonce', 'hash', 'ext', 'mac', 'app', 'dlg']; - - if (!header) { - return Boom.unauthorized(null, 'Hawk'); - } - - if (header.length > exports.limits.maxMatchLength) { - return Boom.badRequest('Header length too long'); - } - - const headerParts = header.match(internals.authHeaderRegex); - if (!headerParts) { - return Boom.badRequest('Invalid header syntax'); - } - - const scheme = headerParts[1]; - if (scheme.toLowerCase() !== 'hawk') { - return Boom.unauthorized(null, 'Hawk'); - } - - const attributesString = headerParts[2]; - if (!attributesString) { - return Boom.badRequest('Invalid header syntax'); - } - - const attributes = {}; - let errorMessage = ''; - const verify = attributesString.replace(/(\w+)="([^"\\]*)"\s*(?:,\s*|$)/g, ($0, $1, $2) => { - - // Check valid attribute names - - if (keys.indexOf($1) === -1) { - errorMessage = 'Unknown attribute: ' + $1; - return; - } - - // Allowed attribute value characters - - if ($2.match(internals.attributeRegex) === null) { - errorMessage = 'Bad attribute value: ' + $1; - return; - } - - // Check for duplicates - - if (attributes.hasOwnProperty($1)) { - errorMessage = 'Duplicate attribute: ' + $1; - return; - } - - attributes[$1] = $2; - return ''; - }); - - if (verify !== '') { - return Boom.badRequest(errorMessage || 'Bad header format'); - } - - return attributes; -}; - - -exports.unauthorized = function (message, attributes) { - - return Boom.unauthorized(message || null, 'Hawk', attributes); -}; - - -},{"../package.json":156,"boom":143,"sntp":169}],156:[function(require,module,exports){ -module.exports={ - "_args": [ - [ - "hawk@6.0.2", - "/Users/krcrane/src/ibm/starter-kit-service-deployer" - ] - ], - "_from": "hawk@6.0.2", - "_id": "hawk@6.0.2", - "_inBundle": false, - "_integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "_location": "/request/hawk", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "hawk@6.0.2", - "name": "hawk", - "escapedName": "hawk", - "rawSpec": "6.0.2", - "saveSpec": null, - "fetchSpec": "6.0.2" - }, - "_requiredBy": [ - "/request" - ], - "_resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "_spec": "6.0.2", - "_where": "/Users/krcrane/src/ibm/starter-kit-service-deployer", - "author": { - "name": "Eran Hammer", - "email": "eran@hammer.io", - "url": "http://hueniverse.com" - }, - "babel": { - "presets": [ - "es2015" - ] - }, - "browser": "dist/browser.js", - "bugs": { - "url": "https://github.com/hueniverse/hawk/issues" - }, - "dependencies": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" - }, - "description": "HTTP Hawk Authentication Scheme", - "devDependencies": { - "babel-cli": "^6.1.2", - "babel-preset-es2015": "^6.1.2", - "code": "4.x.x", - "lab": "14.x.x" - }, - "engines": { - "node": ">=4.5.0" - }, - "homepage": "https://github.com/hueniverse/hawk#readme", - "keywords": [ - "http", - "authentication", - "scheme", - "hawk" - ], - "license": "BSD-3-Clause", - "main": "lib/index.js", - "name": "hawk", - "repository": { - "type": "git", - "url": "git://github.com/hueniverse/hawk.git" - }, - "scripts": { - "build-client": "mkdir -p dist; babel lib/browser.js --out-file dist/browser.js", - "prepublish": "npm run-script build-client", - "test": "lab -a code -t 100 -L", - "test-cov-html": "lab -a code -r html -o coverage.html" - }, - "version": "6.0.2" -} - -},{}],157:[function(require,module,exports){ -'use strict'; - -// Declare internals - -const internals = {}; - - -exports.escapeJavaScript = function (input) { - - if (!input) { - return ''; - } - - let escaped = ''; - - for (let i = 0; i < input.length; ++i) { - - const charCode = input.charCodeAt(i); - - if (internals.isSafe(charCode)) { - escaped += input[i]; - } - else { - escaped += internals.escapeJavaScriptChar(charCode); - } - } - - return escaped; -}; - - -exports.escapeHtml = function (input) { - - if (!input) { - return ''; - } - - let escaped = ''; - - for (let i = 0; i < input.length; ++i) { - - const charCode = input.charCodeAt(i); - - if (internals.isSafe(charCode)) { - escaped += input[i]; - } - else { - escaped += internals.escapeHtmlChar(charCode); - } - } - - return escaped; -}; - - -exports.escapeJson = function (input) { - - if (!input) { - return ''; - } - - const lessThan = 0x3C; - const greaterThan = 0x3E; - const andSymbol = 0x26; - const lineSeperator = 0x2028; - - // replace method - let charCode; - return input.replace(/[<>&\u2028\u2029]/g, (match) => { - - charCode = match.charCodeAt(0); - - if (charCode === lessThan) { - return '\\u003c'; - } - else if (charCode === greaterThan) { - return '\\u003e'; - } - else if (charCode === andSymbol) { - return '\\u0026'; - } - else if (charCode === lineSeperator) { - return '\\u2028'; - } - return '\\u2029'; - }); -}; - - -internals.escapeJavaScriptChar = function (charCode) { - - if (charCode >= 256) { - return '\\u' + internals.padLeft('' + charCode, 4); - } - - const hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex'); - return '\\x' + internals.padLeft(hexValue, 2); -}; - - -internals.escapeHtmlChar = function (charCode) { - - const namedEscape = internals.namedHtml[charCode]; - if (typeof namedEscape !== 'undefined') { - return namedEscape; - } - - if (charCode >= 256) { - return '&#' + charCode + ';'; - } - - const hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex'); - return '&#x' + internals.padLeft(hexValue, 2) + ';'; -}; - - -internals.padLeft = function (str, len) { - - while (str.length < len) { - str = '0' + str; - } - - return str; -}; - - -internals.isSafe = function (charCode) { - - return (typeof internals.safeCharCodes[charCode] !== 'undefined'); -}; - - -internals.namedHtml = { - '38': '&', - '60': '<', - '62': '>', - '34': '"', - '160': ' ', - '162': '¢', - '163': '£', - '164': '¤', - '169': '©', - '174': '®' -}; - - -internals.safeCharCodes = (function () { - - const safe = {}; - - for (let i = 32; i < 123; ++i) { - - if ((i >= 97) || // a-z - (i >= 65 && i <= 90) || // A-Z - (i >= 48 && i <= 57) || // 0-9 - i === 32 || // space - i === 46 || // . - i === 44 || // , - i === 45 || // - - i === 58 || // : - i === 95) { // _ - - safe[i] = null; - } - } - - return safe; -}()); - -},{}],158:[function(require,module,exports){ -'use strict'; - -// Load modules - -const Crypto = require('crypto'); -const Path = require('path'); -const Util = require('util'); -const Escape = require('./escape'); - - -// Declare internals - -const internals = {}; - - -// Clone object or array - -exports.clone = function (obj, seen) { - - if (typeof obj !== 'object' || - obj === null) { - - return obj; - } - - seen = seen || new Map(); - - const lookup = seen.get(obj); - if (lookup) { - return lookup; - } - - let newObj; - let cloneDeep = false; - - if (!Array.isArray(obj)) { - if (Buffer.isBuffer(obj)) { - newObj = new Buffer(obj); - } - else if (obj instanceof Date) { - newObj = new Date(obj.getTime()); - } - else if (obj instanceof RegExp) { - newObj = new RegExp(obj); - } - else { - const proto = Object.getPrototypeOf(obj); - if (proto && - proto.isImmutable) { - - newObj = obj; - } - else { - newObj = Object.create(proto); - cloneDeep = true; - } - } - } - else { - newObj = []; - cloneDeep = true; - } - - seen.set(obj, newObj); - - if (cloneDeep) { - const keys = Object.getOwnPropertyNames(obj); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - const descriptor = Object.getOwnPropertyDescriptor(obj, key); - if (descriptor && - (descriptor.get || - descriptor.set)) { - - Object.defineProperty(newObj, key, descriptor); - } - else { - newObj[key] = exports.clone(obj[key], seen); - } - } - } - - return newObj; -}; - - -// Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied - -/*eslint-disable */ -exports.merge = function (target, source, isNullOverride /* = true */, isMergeArrays /* = true */) { -/*eslint-enable */ - - exports.assert(target && typeof target === 'object', 'Invalid target value: must be an object'); - exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object'); - - if (!source) { - return target; - } - - if (Array.isArray(source)) { - exports.assert(Array.isArray(target), 'Cannot merge array onto an object'); - if (isMergeArrays === false) { // isMergeArrays defaults to true - target.length = 0; // Must not change target assignment - } - - for (let i = 0; i < source.length; ++i) { - target.push(exports.clone(source[i])); - } - - return target; - } - - const keys = Object.keys(source); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - if (key === '__proto__') { - continue; - } - - const value = source[key]; - if (value && - typeof value === 'object') { - - if (!target[key] || - typeof target[key] !== 'object' || - (Array.isArray(target[key]) !== Array.isArray(value)) || - value instanceof Date || - Buffer.isBuffer(value) || - value instanceof RegExp) { - - target[key] = exports.clone(value); - } - else { - exports.merge(target[key], value, isNullOverride, isMergeArrays); - } - } - else { - if (value !== null && - value !== undefined) { // Explicit to preserve empty strings - - target[key] = value; - } - else if (isNullOverride !== false) { // Defaults to true - target[key] = value; - } - } - } - - return target; -}; - - -// Apply options to a copy of the defaults - -exports.applyToDefaults = function (defaults, options, isNullOverride) { - - exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object'); - exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object'); - - if (!options) { // If no options, return null - return null; - } - - const copy = exports.clone(defaults); - - if (options === true) { // If options is set to true, use defaults - return copy; - } - - return exports.merge(copy, options, isNullOverride === true, false); -}; - - -// Clone an object except for the listed keys which are shallow copied - -exports.cloneWithShallow = function (source, keys) { - - if (!source || - typeof source !== 'object') { - - return source; - } - - const storage = internals.store(source, keys); // Move shallow copy items to storage - const copy = exports.clone(source); // Deep copy the rest - internals.restore(copy, source, storage); // Shallow copy the stored items and restore - return copy; -}; - - -internals.store = function (source, keys) { - - const storage = {}; - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - const value = exports.reach(source, key); - if (value !== undefined) { - storage[key] = value; - internals.reachSet(source, key, undefined); - } - } - - return storage; -}; - - -internals.restore = function (copy, source, storage) { - - const keys = Object.keys(storage); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - internals.reachSet(copy, key, storage[key]); - internals.reachSet(source, key, storage[key]); - } -}; - - -internals.reachSet = function (obj, key, value) { - - const path = key.split('.'); - let ref = obj; - for (let i = 0; i < path.length; ++i) { - const segment = path[i]; - if (i + 1 === path.length) { - ref[segment] = value; - } - - ref = ref[segment]; - } -}; - - -// Apply options to defaults except for the listed keys which are shallow copied from option without merging - -exports.applyToDefaultsWithShallow = function (defaults, options, keys) { - - exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object'); - exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object'); - exports.assert(keys && Array.isArray(keys), 'Invalid keys'); - - if (!options) { // If no options, return null - return null; - } - - const copy = exports.cloneWithShallow(defaults, keys); - - if (options === true) { // If options is set to true, use defaults - return copy; - } - - const storage = internals.store(options, keys); // Move shallow copy items to storage - exports.merge(copy, options, false, false); // Deep copy the rest - internals.restore(copy, options, storage); // Shallow copy the stored items and restore - return copy; -}; - - -// Deep object or array comparison - -exports.deepEqual = function (obj, ref, options, seen) { - - options = options || { prototype: true }; - - const type = typeof obj; - - if (type !== typeof ref) { - return false; - } - - if (type !== 'object' || - obj === null || - ref === null) { - - if (obj === ref) { // Copied from Deep-eql, copyright(c) 2013 Jake Luer, jake@alogicalparadox.com, MIT Licensed, https://github.com/chaijs/deep-eql - return obj !== 0 || 1 / obj === 1 / ref; // -0 / +0 - } - - return obj !== obj && ref !== ref; // NaN - } - - seen = seen || []; - if (seen.indexOf(obj) !== -1) { - return true; // If previous comparison failed, it would have stopped execution - } - - seen.push(obj); - - if (Array.isArray(obj)) { - if (!Array.isArray(ref)) { - return false; - } - - if (!options.part && obj.length !== ref.length) { - return false; - } - - for (let i = 0; i < obj.length; ++i) { - if (options.part) { - let found = false; - for (let j = 0; j < ref.length; ++j) { - if (exports.deepEqual(obj[i], ref[j], options)) { - found = true; - break; - } - } - - return found; - } - - if (!exports.deepEqual(obj[i], ref[i], options)) { - return false; - } - } - - return true; - } - - if (Buffer.isBuffer(obj)) { - if (!Buffer.isBuffer(ref)) { - return false; - } - - if (obj.length !== ref.length) { - return false; - } - - for (let i = 0; i < obj.length; ++i) { - if (obj[i] !== ref[i]) { - return false; - } - } - - return true; - } - - if (obj instanceof Date) { - return (ref instanceof Date && obj.getTime() === ref.getTime()); - } - - if (obj instanceof RegExp) { - return (ref instanceof RegExp && obj.toString() === ref.toString()); - } - - if (options.prototype) { - if (Object.getPrototypeOf(obj) !== Object.getPrototypeOf(ref)) { - return false; - } - } - - const keys = Object.getOwnPropertyNames(obj); - - if (!options.part && keys.length !== Object.getOwnPropertyNames(ref).length) { - return false; - } - - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - const descriptor = Object.getOwnPropertyDescriptor(obj, key); - if (descriptor.get) { - if (!exports.deepEqual(descriptor, Object.getOwnPropertyDescriptor(ref, key), options, seen)) { - return false; - } - } - else if (!exports.deepEqual(obj[key], ref[key], options, seen)) { - return false; - } - } - - return true; -}; - - -// Remove duplicate items from array - -exports.unique = (array, key) => { - - let result; - if (key) { - result = []; - const index = new Set(); - array.forEach((item) => { - - const identifier = item[key]; - if (!index.has(identifier)) { - index.add(identifier); - result.push(item); - } - }); - } - else { - result = Array.from(new Set(array)); - } - - return result; -}; - - -// Convert array into object - -exports.mapToObject = function (array, key) { - - if (!array) { - return null; - } - - const obj = {}; - for (let i = 0; i < array.length; ++i) { - if (key) { - if (array[i][key]) { - obj[array[i][key]] = true; - } - } - else { - obj[array[i]] = true; - } - } - - return obj; -}; - - -// Find the common unique items in two arrays - -exports.intersect = function (array1, array2, justFirst) { - - if (!array1 || !array2) { - return []; - } - - const common = []; - const hash = (Array.isArray(array1) ? exports.mapToObject(array1) : array1); - const found = {}; - for (let i = 0; i < array2.length; ++i) { - if (hash[array2[i]] && !found[array2[i]]) { - if (justFirst) { - return array2[i]; - } - - common.push(array2[i]); - found[array2[i]] = true; - } - } - - return (justFirst ? null : common); -}; - - -// Test if the reference contains the values - -exports.contain = function (ref, values, options) { - - /* - string -> string(s) - array -> item(s) - object -> key(s) - object -> object (key:value) - */ - - let valuePairs = null; - if (typeof ref === 'object' && - typeof values === 'object' && - !Array.isArray(ref) && - !Array.isArray(values)) { - - valuePairs = values; - values = Object.keys(values); - } - else { - values = [].concat(values); - } - - options = options || {}; // deep, once, only, part - - exports.assert(arguments.length >= 2, 'Insufficient arguments'); - exports.assert(typeof ref === 'string' || typeof ref === 'object', 'Reference must be string or an object'); - exports.assert(values.length, 'Values array cannot be empty'); - - let compare; - let compareFlags; - if (options.deep) { - compare = exports.deepEqual; - - const hasOnly = options.hasOwnProperty('only'); - const hasPart = options.hasOwnProperty('part'); - - compareFlags = { - prototype: hasOnly ? options.only : hasPart ? !options.part : false, - part: hasOnly ? !options.only : hasPart ? options.part : true - }; - } - else { - compare = (a, b) => a === b; - } - - let misses = false; - const matches = new Array(values.length); - for (let i = 0; i < matches.length; ++i) { - matches[i] = 0; - } - - if (typeof ref === 'string') { - let pattern = '('; - for (let i = 0; i < values.length; ++i) { - const value = values[i]; - exports.assert(typeof value === 'string', 'Cannot compare string reference to non-string value'); - pattern += (i ? '|' : '') + exports.escapeRegex(value); - } - - const regex = new RegExp(pattern + ')', 'g'); - const leftovers = ref.replace(regex, ($0, $1) => { - - const index = values.indexOf($1); - ++matches[index]; - return ''; // Remove from string - }); - - misses = !!leftovers; - } - else if (Array.isArray(ref)) { - for (let i = 0; i < ref.length; ++i) { - let matched = false; - for (let j = 0; j < values.length && matched === false; ++j) { - matched = compare(values[j], ref[i], compareFlags) && j; - } - - if (matched !== false) { - ++matches[matched]; - } - else { - misses = true; - } - } - } - else { - const keys = Object.getOwnPropertyNames(ref); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - const pos = values.indexOf(key); - if (pos !== -1) { - if (valuePairs && - !compare(valuePairs[key], ref[key], compareFlags)) { - - return false; - } - - ++matches[pos]; - } - else { - misses = true; - } - } - } - - let result = false; - for (let i = 0; i < matches.length; ++i) { - result = result || !!matches[i]; - if ((options.once && matches[i] > 1) || - (!options.part && !matches[i])) { - - return false; - } - } - - if (options.only && - misses) { - - return false; - } - - return result; -}; - - -// Flatten array - -exports.flatten = function (array, target) { - - const result = target || []; - - for (let i = 0; i < array.length; ++i) { - if (Array.isArray(array[i])) { - exports.flatten(array[i], result); - } - else { - result.push(array[i]); - } - } - - return result; -}; - - -// Convert an object key chain string ('a.b.c') to reference (object[a][b][c]) - -exports.reach = function (obj, chain, options) { - - if (chain === false || - chain === null || - typeof chain === 'undefined') { - - return obj; - } - - options = options || {}; - if (typeof options === 'string') { - options = { separator: options }; - } - - const path = chain.split(options.separator || '.'); - let ref = obj; - for (let i = 0; i < path.length; ++i) { - let key = path[i]; - if (key[0] === '-' && Array.isArray(ref)) { - key = key.slice(1, key.length); - key = ref.length - key; - } - - if (!ref || - !((typeof ref === 'object' || typeof ref === 'function') && key in ref) || - (typeof ref !== 'object' && options.functions === false)) { // Only object and function can have properties - - exports.assert(!options.strict || i + 1 === path.length, 'Missing segment', key, 'in reach path ', chain); - exports.assert(typeof ref === 'object' || options.functions === true || typeof ref !== 'function', 'Invalid segment', key, 'in reach path ', chain); - ref = options.default; - break; - } - - ref = ref[key]; - } - - return ref; -}; - - -exports.reachTemplate = function (obj, template, options) { - - return template.replace(/{([^}]+)}/g, ($0, chain) => { - - const value = exports.reach(obj, chain, options); - return (value === undefined || value === null ? '' : value); - }); -}; - - -exports.formatStack = function (stack) { - - const trace = []; - for (let i = 0; i < stack.length; ++i) { - const item = stack[i]; - trace.push([item.getFileName(), item.getLineNumber(), item.getColumnNumber(), item.getFunctionName(), item.isConstructor()]); - } - - return trace; -}; - - -exports.formatTrace = function (trace) { - - const display = []; - - for (let i = 0; i < trace.length; ++i) { - const row = trace[i]; - display.push((row[4] ? 'new ' : '') + row[3] + ' (' + row[0] + ':' + row[1] + ':' + row[2] + ')'); - } - - return display; -}; - - -exports.callStack = function (slice) { - - // http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi - - const v8 = Error.prepareStackTrace; - Error.prepareStackTrace = function (_, stack) { - - return stack; - }; - - const capture = {}; - Error.captureStackTrace(capture, this); // arguments.callee is not supported in strict mode so we use this and slice the trace of this off the result - const stack = capture.stack; - - Error.prepareStackTrace = v8; - - const trace = exports.formatStack(stack); - - return trace.slice(1 + slice); -}; - - -exports.displayStack = function (slice) { - - const trace = exports.callStack(slice === undefined ? 1 : slice + 1); - - return exports.formatTrace(trace); -}; - - -exports.abortThrow = false; - - -exports.abort = function (message, hideStack) { - - if (process.env.NODE_ENV === 'test' || exports.abortThrow === true) { - throw new Error(message || 'Unknown error'); - } - - let stack = ''; - if (!hideStack) { - stack = exports.displayStack(1).join('\n\t'); - } - console.log('ABORT: ' + message + '\n\t' + stack); - process.exit(1); -}; - - -exports.assert = function (condition /*, msg1, msg2, msg3 */) { - - if (condition) { - return; - } - - if (arguments.length === 2 && arguments[1] instanceof Error) { - throw arguments[1]; - } - - let msgs = []; - for (let i = 1; i < arguments.length; ++i) { - if (arguments[i] !== '') { - msgs.push(arguments[i]); // Avoids Array.slice arguments leak, allowing for V8 optimizations - } - } - - msgs = msgs.map((msg) => { - - return typeof msg === 'string' ? msg : msg instanceof Error ? msg.message : exports.stringify(msg); - }); - - throw new Error(msgs.join(' ') || 'Unknown error'); -}; - - -exports.Timer = function () { - - this.ts = 0; - this.reset(); -}; - - -exports.Timer.prototype.reset = function () { - - this.ts = Date.now(); -}; - - -exports.Timer.prototype.elapsed = function () { - - return Date.now() - this.ts; -}; - - -exports.Bench = function () { - - this.ts = 0; - this.reset(); -}; - - -exports.Bench.prototype.reset = function () { - - this.ts = exports.Bench.now(); -}; - - -exports.Bench.prototype.elapsed = function () { - - return exports.Bench.now() - this.ts; -}; - - -exports.Bench.now = function () { - - const ts = process.hrtime(); - return (ts[0] * 1e3) + (ts[1] / 1e6); -}; - - -// Escape string for Regex construction - -exports.escapeRegex = function (string) { - - // Escape ^$.*+-?=!:|\/()[]{}, - return string.replace(/[\^\$\.\*\+\-\?\=\!\:\|\\\/\(\)\[\]\{\}\,]/g, '\\$&'); -}; - - -// Base64url (RFC 4648) encode - -exports.base64urlEncode = function (value, encoding) { - - exports.assert(typeof value === 'string' || Buffer.isBuffer(value), 'value must be string or buffer'); - const buf = (Buffer.isBuffer(value) ? value : new Buffer(value, encoding || 'binary')); - return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); -}; - - -// Base64url (RFC 4648) decode - -exports.base64urlDecode = function (value, encoding) { - - if (typeof value !== 'string') { - - return new Error('Value not a string'); - } - - if (!/^[\w\-]*$/.test(value)) { - - return new Error('Invalid character'); - } - - const buf = new Buffer(value, 'base64'); - return (encoding === 'buffer' ? buf : buf.toString(encoding || 'binary')); -}; - - -// Escape attribute value for use in HTTP header - -exports.escapeHeaderAttribute = function (attribute) { - - // Allowed value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9, \, " - - exports.assert(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~\"\\]*$/.test(attribute), 'Bad attribute value (' + attribute + ')'); - - return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"'); // Escape quotes and slash -}; - - -exports.escapeHtml = function (string) { - - return Escape.escapeHtml(string); -}; - - -exports.escapeJavaScript = function (string) { - - return Escape.escapeJavaScript(string); -}; - -exports.escapeJson = function (string) { - - return Escape.escapeJson(string); -}; - -exports.nextTick = function (callback) { - - return function () { - - const args = arguments; - process.nextTick(() => { - - callback.apply(null, args); - }); - }; -}; - - -exports.once = function (method) { - - if (method._hoekOnce) { - return method; - } - - let once = false; - const wrapped = function () { - - if (!once) { - once = true; - method.apply(null, arguments); - } - }; - - wrapped._hoekOnce = true; - - return wrapped; -}; - - -exports.isInteger = Number.isSafeInteger; - - -exports.ignore = function () { }; - - -exports.inherits = Util.inherits; - - -exports.format = Util.format; - - -exports.transform = function (source, transform, options) { - - exports.assert(source === null || source === undefined || typeof source === 'object' || Array.isArray(source), 'Invalid source object: must be null, undefined, an object, or an array'); - const separator = (typeof options === 'object' && options !== null) ? (options.separator || '.') : '.'; - - if (Array.isArray(source)) { - const results = []; - for (let i = 0; i < source.length; ++i) { - results.push(exports.transform(source[i], transform, options)); - } - return results; - } - - const result = {}; - const keys = Object.keys(transform); - - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - const path = key.split(separator); - const sourcePath = transform[key]; - - exports.assert(typeof sourcePath === 'string', 'All mappings must be "." delineated strings'); - - let segment; - let res = result; - - while (path.length > 1) { - segment = path.shift(); - if (!res[segment]) { - res[segment] = {}; - } - res = res[segment]; - } - segment = path.shift(); - res[segment] = exports.reach(source, sourcePath, options); - } - - return result; -}; - - -exports.uniqueFilename = function (path, extension) { - - if (extension) { - extension = extension[0] !== '.' ? '.' + extension : extension; - } - else { - extension = ''; - } - - path = Path.resolve(path); - const name = [Date.now(), process.pid, Crypto.randomBytes(8).toString('hex')].join('-') + extension; - return Path.join(path, name); -}; - - -exports.stringify = function () { - - try { - return JSON.stringify.apply(null, arguments); - } - catch (err) { - return '[Cannot display object: ' + err.message + ']'; - } -}; - - -exports.shallow = function (source) { - - const target = {}; - const keys = Object.keys(source); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - target[key] = source[key]; - } - - return target; -}; - -},{"./escape":157,"crypto":undefined,"path":undefined,"util":undefined}],159:[function(require,module,exports){ -// Copyright 2015 Joyent, Inc. - -var parser = require('./parser'); -var signer = require('./signer'); -var verify = require('./verify'); -var utils = require('./utils'); - - - -///--- API - -module.exports = { - - parse: parser.parseRequest, - parseRequest: parser.parseRequest, - - sign: signer.signRequest, - signRequest: signer.signRequest, - createSigner: signer.createSigner, - isSigner: signer.isSigner, - - sshKeyToPEM: utils.sshKeyToPEM, - sshKeyFingerprint: utils.fingerprint, - pemToRsaSSHKey: utils.pemToRsaSSHKey, - - verify: verify.verifySignature, - verifySignature: verify.verifySignature, - verifyHMAC: verify.verifyHMAC -}; - -},{"./parser":160,"./signer":161,"./utils":162,"./verify":163}],160:[function(require,module,exports){ -// Copyright 2012 Joyent, Inc. All rights reserved. - -var assert = require('assert-plus'); -var util = require('util'); -var utils = require('./utils'); - - - -///--- Globals - -var HASH_ALGOS = utils.HASH_ALGOS; -var PK_ALGOS = utils.PK_ALGOS; -var HttpSignatureError = utils.HttpSignatureError; -var InvalidAlgorithmError = utils.InvalidAlgorithmError; -var validateAlgorithm = utils.validateAlgorithm; - -var State = { - New: 0, - Params: 1 -}; - -var ParamsState = { - Name: 0, - Quote: 1, - Value: 2, - Comma: 3 -}; - - -///--- Specific Errors - - -function ExpiredRequestError(message) { - HttpSignatureError.call(this, message, ExpiredRequestError); -} -util.inherits(ExpiredRequestError, HttpSignatureError); - - -function InvalidHeaderError(message) { - HttpSignatureError.call(this, message, InvalidHeaderError); -} -util.inherits(InvalidHeaderError, HttpSignatureError); - - -function InvalidParamsError(message) { - HttpSignatureError.call(this, message, InvalidParamsError); -} -util.inherits(InvalidParamsError, HttpSignatureError); - - -function MissingHeaderError(message) { - HttpSignatureError.call(this, message, MissingHeaderError); -} -util.inherits(MissingHeaderError, HttpSignatureError); - -function StrictParsingError(message) { - HttpSignatureError.call(this, message, StrictParsingError); -} -util.inherits(StrictParsingError, HttpSignatureError); - -///--- Exported API - -module.exports = { - - /** - * Parses the 'Authorization' header out of an http.ServerRequest object. - * - * Note that this API will fully validate the Authorization header, and throw - * on any error. It will not however check the signature, or the keyId format - * as those are specific to your environment. You can use the options object - * to pass in extra constraints. - * - * As a response object you can expect this: - * - * { - * "scheme": "Signature", - * "params": { - * "keyId": "foo", - * "algorithm": "rsa-sha256", - * "headers": [ - * "date" or "x-date", - * "digest" - * ], - * "signature": "base64" - * }, - * "signingString": "ready to be passed to crypto.verify()" - * } - * - * @param {Object} request an http.ServerRequest. - * @param {Object} options an optional options object with: - * - clockSkew: allowed clock skew in seconds (default 300). - * - headers: required header names (def: date or x-date) - * - algorithms: algorithms to support (default: all). - * - strict: should enforce latest spec parsing - * (default: false). - * @return {Object} parsed out object (see above). - * @throws {TypeError} on invalid input. - * @throws {InvalidHeaderError} on an invalid Authorization header error. - * @throws {InvalidParamsError} if the params in the scheme are invalid. - * @throws {MissingHeaderError} if the params indicate a header not present, - * either in the request headers from the params, - * or not in the params from a required header - * in options. - * @throws {StrictParsingError} if old attributes are used in strict parsing - * mode. - * @throws {ExpiredRequestError} if the value of date or x-date exceeds skew. - */ - parseRequest: function parseRequest(request, options) { - assert.object(request, 'request'); - assert.object(request.headers, 'request.headers'); - if (options === undefined) { - options = {}; - } - if (options.headers === undefined) { - options.headers = [request.headers['x-date'] ? 'x-date' : 'date']; - } - assert.object(options, 'options'); - assert.arrayOfString(options.headers, 'options.headers'); - assert.optionalFinite(options.clockSkew, 'options.clockSkew'); - - var authzHeaderName = options.authorizationHeaderName || 'authorization'; - - if (!request.headers[authzHeaderName]) { - throw new MissingHeaderError('no ' + authzHeaderName + ' header ' + - 'present in the request'); - } - - options.clockSkew = options.clockSkew || 300; - - - var i = 0; - var state = State.New; - var substate = ParamsState.Name; - var tmpName = ''; - var tmpValue = ''; - - var parsed = { - scheme: '', - params: {}, - signingString: '' - }; - - var authz = request.headers[authzHeaderName]; - for (i = 0; i < authz.length; i++) { - var c = authz.charAt(i); - - switch (Number(state)) { - - case State.New: - if (c !== ' ') parsed.scheme += c; - else state = State.Params; - break; - - case State.Params: - switch (Number(substate)) { - - case ParamsState.Name: - var code = c.charCodeAt(0); - // restricted name of A-Z / a-z - if ((code >= 0x41 && code <= 0x5a) || // A-Z - (code >= 0x61 && code <= 0x7a)) { // a-z - tmpName += c; - } else if (c === '=') { - if (tmpName.length === 0) - throw new InvalidHeaderError('bad param format'); - substate = ParamsState.Quote; - } else { - throw new InvalidHeaderError('bad param format'); - } - break; - - case ParamsState.Quote: - if (c === '"') { - tmpValue = ''; - substate = ParamsState.Value; - } else { - throw new InvalidHeaderError('bad param format'); - } - break; - - case ParamsState.Value: - if (c === '"') { - parsed.params[tmpName] = tmpValue; - substate = ParamsState.Comma; - } else { - tmpValue += c; - } - break; - - case ParamsState.Comma: - if (c === ',') { - tmpName = ''; - substate = ParamsState.Name; - } else { - throw new InvalidHeaderError('bad param format'); - } - break; - - default: - throw new Error('Invalid substate'); - } - break; - - default: - throw new Error('Invalid substate'); - } - - } - - if (!parsed.params.headers || parsed.params.headers === '') { - if (request.headers['x-date']) { - parsed.params.headers = ['x-date']; - } else { - parsed.params.headers = ['date']; - } - } else { - parsed.params.headers = parsed.params.headers.split(' '); - } - - // Minimally validate the parsed object - if (!parsed.scheme || parsed.scheme !== 'Signature') - throw new InvalidHeaderError('scheme was not "Signature"'); - - if (!parsed.params.keyId) - throw new InvalidHeaderError('keyId was not specified'); - - if (!parsed.params.algorithm) - throw new InvalidHeaderError('algorithm was not specified'); - - if (!parsed.params.signature) - throw new InvalidHeaderError('signature was not specified'); - - // Check the algorithm against the official list - parsed.params.algorithm = parsed.params.algorithm.toLowerCase(); - try { - validateAlgorithm(parsed.params.algorithm); - } catch (e) { - if (e instanceof InvalidAlgorithmError) - throw (new InvalidParamsError(parsed.params.algorithm + ' is not ' + - 'supported')); - else - throw (e); - } - - // Build the signingString - for (i = 0; i < parsed.params.headers.length; i++) { - var h = parsed.params.headers[i].toLowerCase(); - parsed.params.headers[i] = h; - - if (h === 'request-line') { - if (!options.strict) { - /* - * We allow headers from the older spec drafts if strict parsing isn't - * specified in options. - */ - parsed.signingString += - request.method + ' ' + request.url + ' HTTP/' + request.httpVersion; - } else { - /* Strict parsing doesn't allow older draft headers. */ - throw (new StrictParsingError('request-line is not a valid header ' + - 'with strict parsing enabled.')); - } - } else if (h === '(request-target)') { - parsed.signingString += - '(request-target): ' + request.method.toLowerCase() + ' ' + - request.url; - } else { - var value = request.headers[h]; - if (value === undefined) - throw new MissingHeaderError(h + ' was not in the request'); - parsed.signingString += h + ': ' + value; - } - - if ((i + 1) < parsed.params.headers.length) - parsed.signingString += '\n'; - } - - // Check against the constraints - var date; - if (request.headers.date || request.headers['x-date']) { - if (request.headers['x-date']) { - date = new Date(request.headers['x-date']); - } else { - date = new Date(request.headers.date); - } - var now = new Date(); - var skew = Math.abs(now.getTime() - date.getTime()); - - if (skew > options.clockSkew * 1000) { - throw new ExpiredRequestError('clock skew of ' + - (skew / 1000) + - 's was greater than ' + - options.clockSkew + 's'); - } - } - - options.headers.forEach(function (hdr) { - // Remember that we already checked any headers in the params - // were in the request, so if this passes we're good. - if (parsed.params.headers.indexOf(hdr.toLowerCase()) < 0) - throw new MissingHeaderError(hdr + ' was not a signed header'); - }); - - if (options.algorithms) { - if (options.algorithms.indexOf(parsed.params.algorithm) === -1) - throw new InvalidParamsError(parsed.params.algorithm + - ' is not a supported algorithm'); - } - - parsed.algorithm = parsed.params.algorithm.toUpperCase(); - parsed.keyId = parsed.params.keyId; - return parsed; - } - -}; - -},{"./utils":162,"assert-plus":141,"util":undefined}],161:[function(require,module,exports){ -// Copyright 2012 Joyent, Inc. All rights reserved. - -var assert = require('assert-plus'); -var crypto = require('crypto'); -var http = require('http'); -var util = require('util'); -var sshpk = require('sshpk'); -var jsprim = require('jsprim'); -var utils = require('./utils'); - -var sprintf = require('util').format; - -var HASH_ALGOS = utils.HASH_ALGOS; -var PK_ALGOS = utils.PK_ALGOS; -var InvalidAlgorithmError = utils.InvalidAlgorithmError; -var HttpSignatureError = utils.HttpSignatureError; -var validateAlgorithm = utils.validateAlgorithm; - -///--- Globals - -var AUTHZ_FMT = - 'Signature keyId="%s",algorithm="%s",headers="%s",signature="%s"'; - -///--- Specific Errors - -function MissingHeaderError(message) { - HttpSignatureError.call(this, message, MissingHeaderError); -} -util.inherits(MissingHeaderError, HttpSignatureError); - -function StrictParsingError(message) { - HttpSignatureError.call(this, message, StrictParsingError); -} -util.inherits(StrictParsingError, HttpSignatureError); - -/* See createSigner() */ -function RequestSigner(options) { - assert.object(options, 'options'); - - var alg = []; - if (options.algorithm !== undefined) { - assert.string(options.algorithm, 'options.algorithm'); - alg = validateAlgorithm(options.algorithm); - } - this.rs_alg = alg; - - /* - * RequestSigners come in two varieties: ones with an rs_signFunc, and ones - * with an rs_signer. - * - * rs_signFunc-based RequestSigners have to build up their entire signing - * string within the rs_lines array and give it to rs_signFunc as a single - * concat'd blob. rs_signer-based RequestSigners can add a line at a time to - * their signing state by using rs_signer.update(), thus only needing to - * buffer the hash function state and one line at a time. - */ - if (options.sign !== undefined) { - assert.func(options.sign, 'options.sign'); - this.rs_signFunc = options.sign; - - } else if (alg[0] === 'hmac' && options.key !== undefined) { - assert.string(options.keyId, 'options.keyId'); - this.rs_keyId = options.keyId; - - if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key)) - throw (new TypeError('options.key for HMAC must be a string or Buffer')); - - /* - * Make an rs_signer for HMACs, not a rs_signFunc -- HMACs digest their - * data in chunks rather than requiring it all to be given in one go - * at the end, so they are more similar to signers than signFuncs. - */ - this.rs_signer = crypto.createHmac(alg[1].toUpperCase(), options.key); - this.rs_signer.sign = function () { - var digest = this.digest('base64'); - return ({ - hashAlgorithm: alg[1], - toString: function () { return (digest); } - }); - }; - - } else if (options.key !== undefined) { - var key = options.key; - if (typeof (key) === 'string' || Buffer.isBuffer(key)) - key = sshpk.parsePrivateKey(key); - - assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]), - 'options.key must be a sshpk.PrivateKey'); - this.rs_key = key; - - assert.string(options.keyId, 'options.keyId'); - this.rs_keyId = options.keyId; - - if (!PK_ALGOS[key.type]) { - throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' + - 'keys are not supported')); - } - - if (alg[0] !== undefined && key.type !== alg[0]) { - throw (new InvalidAlgorithmError('options.key must be a ' + - alg[0].toUpperCase() + ' key, was given a ' + - key.type.toUpperCase() + ' key instead')); - } - - this.rs_signer = key.createSign(alg[1]); - - } else { - throw (new TypeError('options.sign (func) or options.key is required')); - } - - this.rs_headers = []; - this.rs_lines = []; -} - -/** - * Adds a header to be signed, with its value, into this signer. - * - * @param {String} header - * @param {String} value - * @return {String} value written - */ -RequestSigner.prototype.writeHeader = function (header, value) { - assert.string(header, 'header'); - header = header.toLowerCase(); - assert.string(value, 'value'); - - this.rs_headers.push(header); - - if (this.rs_signFunc) { - this.rs_lines.push(header + ': ' + value); - - } else { - var line = header + ': ' + value; - if (this.rs_headers.length > 0) - line = '\n' + line; - this.rs_signer.update(line); - } - - return (value); -}; - -/** - * Adds a default Date header, returning its value. - * - * @return {String} - */ -RequestSigner.prototype.writeDateHeader = function () { - return (this.writeHeader('date', jsprim.rfc1123(new Date()))); -}; - -/** - * Adds the request target line to be signed. - * - * @param {String} method, HTTP method (e.g. 'get', 'post', 'put') - * @param {String} path - */ -RequestSigner.prototype.writeTarget = function (method, path) { - assert.string(method, 'method'); - assert.string(path, 'path'); - method = method.toLowerCase(); - this.writeHeader('(request-target)', method + ' ' + path); -}; - -/** - * Calculate the value for the Authorization header on this request - * asynchronously. - * - * @param {Func} callback (err, authz) - */ -RequestSigner.prototype.sign = function (cb) { - assert.func(cb, 'callback'); - - if (this.rs_headers.length < 1) - throw (new Error('At least one header must be signed')); - - var alg, authz; - if (this.rs_signFunc) { - var data = this.rs_lines.join('\n'); - var self = this; - this.rs_signFunc(data, function (err, sig) { - if (err) { - cb(err); - return; - } - try { - assert.object(sig, 'signature'); - assert.string(sig.keyId, 'signature.keyId'); - assert.string(sig.algorithm, 'signature.algorithm'); - assert.string(sig.signature, 'signature.signature'); - alg = validateAlgorithm(sig.algorithm); - - authz = sprintf(AUTHZ_FMT, - sig.keyId, - sig.algorithm, - self.rs_headers.join(' '), - sig.signature); - } catch (e) { - cb(e); - return; - } - cb(null, authz); - }); - - } else { - try { - var sigObj = this.rs_signer.sign(); - } catch (e) { - cb(e); - return; - } - alg = (this.rs_alg[0] || this.rs_key.type) + '-' + sigObj.hashAlgorithm; - var signature = sigObj.toString(); - authz = sprintf(AUTHZ_FMT, - this.rs_keyId, - alg, - this.rs_headers.join(' '), - signature); - cb(null, authz); - } -}; - -///--- Exported API - -module.exports = { - /** - * Identifies whether a given object is a request signer or not. - * - * @param {Object} object, the object to identify - * @returns {Boolean} - */ - isSigner: function (obj) { - if (typeof (obj) === 'object' && obj instanceof RequestSigner) - return (true); - return (false); - }, - - /** - * Creates a request signer, used to asynchronously build a signature - * for a request (does not have to be an http.ClientRequest). - * - * @param {Object} options, either: - * - {String} keyId - * - {String|Buffer} key - * - {String} algorithm (optional, required for HMAC) - * or: - * - {Func} sign (data, cb) - * @return {RequestSigner} - */ - createSigner: function createSigner(options) { - return (new RequestSigner(options)); - }, - - /** - * Adds an 'Authorization' header to an http.ClientRequest object. - * - * Note that this API will add a Date header if it's not already set. Any - * other headers in the options.headers array MUST be present, or this - * will throw. - * - * You shouldn't need to check the return type; it's just there if you want - * to be pedantic. - * - * The optional flag indicates whether parsing should use strict enforcement - * of the version draft-cavage-http-signatures-04 of the spec or beyond. - * The default is to be loose and support - * older versions for compatibility. - * - * @param {Object} request an instance of http.ClientRequest. - * @param {Object} options signing parameters object: - * - {String} keyId required. - * - {String} key required (either a PEM or HMAC key). - * - {Array} headers optional; defaults to ['date']. - * - {String} algorithm optional (unless key is HMAC); - * default is the same as the sshpk default - * signing algorithm for the type of key given - * - {String} httpVersion optional; defaults to '1.1'. - * - {Boolean} strict optional; defaults to 'false'. - * @return {Boolean} true if Authorization (and optionally Date) were added. - * @throws {TypeError} on bad parameter types (input). - * @throws {InvalidAlgorithmError} if algorithm was bad or incompatible with - * the given key. - * @throws {sshpk.KeyParseError} if key was bad. - * @throws {MissingHeaderError} if a header to be signed was specified but - * was not present. - */ - signRequest: function signRequest(request, options) { - assert.object(request, 'request'); - assert.object(options, 'options'); - assert.optionalString(options.algorithm, 'options.algorithm'); - assert.string(options.keyId, 'options.keyId'); - assert.optionalArrayOfString(options.headers, 'options.headers'); - assert.optionalString(options.httpVersion, 'options.httpVersion'); - - if (!request.getHeader('Date')) - request.setHeader('Date', jsprim.rfc1123(new Date())); - if (!options.headers) - options.headers = ['date']; - if (!options.httpVersion) - options.httpVersion = '1.1'; - - var alg = []; - if (options.algorithm) { - options.algorithm = options.algorithm.toLowerCase(); - alg = validateAlgorithm(options.algorithm); - } - - var i; - var stringToSign = ''; - for (i = 0; i < options.headers.length; i++) { - if (typeof (options.headers[i]) !== 'string') - throw new TypeError('options.headers must be an array of Strings'); - - var h = options.headers[i].toLowerCase(); - - if (h === 'request-line') { - if (!options.strict) { - /** - * We allow headers from the older spec drafts if strict parsing isn't - * specified in options. - */ - stringToSign += - request.method + ' ' + request.path + ' HTTP/' + - options.httpVersion; - } else { - /* Strict parsing doesn't allow older draft headers. */ - throw (new StrictParsingError('request-line is not a valid header ' + - 'with strict parsing enabled.')); - } - } else if (h === '(request-target)') { - stringToSign += - '(request-target): ' + request.method.toLowerCase() + ' ' + - request.path; - } else { - var value = request.getHeader(h); - if (value === undefined || value === '') { - throw new MissingHeaderError(h + ' was not in the request'); - } - stringToSign += h + ': ' + value; - } - - if ((i + 1) < options.headers.length) - stringToSign += '\n'; - } - - /* This is just for unit tests. */ - if (request.hasOwnProperty('_stringToSign')) { - request._stringToSign = stringToSign; - } - - var signature; - if (alg[0] === 'hmac') { - if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key)) - throw (new TypeError('options.key must be a string or Buffer')); - - var hmac = crypto.createHmac(alg[1].toUpperCase(), options.key); - hmac.update(stringToSign); - signature = hmac.digest('base64'); - - } else { - var key = options.key; - if (typeof (key) === 'string' || Buffer.isBuffer(key)) - key = sshpk.parsePrivateKey(options.key); - - assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]), - 'options.key must be a sshpk.PrivateKey'); - - if (!PK_ALGOS[key.type]) { - throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' + - 'keys are not supported')); - } - - if (alg[0] !== undefined && key.type !== alg[0]) { - throw (new InvalidAlgorithmError('options.key must be a ' + - alg[0].toUpperCase() + ' key, was given a ' + - key.type.toUpperCase() + ' key instead')); - } - - var signer = key.createSign(alg[1]); - signer.update(stringToSign); - var sigObj = signer.sign(); - if (!HASH_ALGOS[sigObj.hashAlgorithm]) { - throw (new InvalidAlgorithmError(sigObj.hashAlgorithm.toUpperCase() + - ' is not a supported hash algorithm')); - } - options.algorithm = key.type + '-' + sigObj.hashAlgorithm; - signature = sigObj.toString(); - assert.notStrictEqual(signature, '', 'empty signature produced'); - } - - var authzHeaderName = options.authorizationHeaderName || 'Authorization'; - - request.setHeader(authzHeaderName, sprintf(AUTHZ_FMT, - options.keyId, - options.algorithm, - options.headers.join(' '), - signature)); - - return true; - } - -}; - -},{"./utils":162,"assert-plus":141,"crypto":undefined,"http":undefined,"jsprim":117,"sshpk":200,"util":undefined}],162:[function(require,module,exports){ -// Copyright 2012 Joyent, Inc. All rights reserved. - -var assert = require('assert-plus'); -var sshpk = require('sshpk'); -var util = require('util'); - -var HASH_ALGOS = { - 'sha1': true, - 'sha256': true, - 'sha512': true -}; - -var PK_ALGOS = { - 'rsa': true, - 'dsa': true, - 'ecdsa': true -}; - -function HttpSignatureError(message, caller) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, caller || HttpSignatureError); - - this.message = message; - this.name = caller.name; -} -util.inherits(HttpSignatureError, Error); - -function InvalidAlgorithmError(message) { - HttpSignatureError.call(this, message, InvalidAlgorithmError); -} -util.inherits(InvalidAlgorithmError, HttpSignatureError); - -function validateAlgorithm(algorithm) { - var alg = algorithm.toLowerCase().split('-'); - - if (alg.length !== 2) { - throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' is not a ' + - 'valid algorithm')); - } - - if (alg[0] !== 'hmac' && !PK_ALGOS[alg[0]]) { - throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' type keys ' + - 'are not supported')); - } - - if (!HASH_ALGOS[alg[1]]) { - throw (new InvalidAlgorithmError(alg[1].toUpperCase() + ' is not a ' + - 'supported hash algorithm')); - } - - return (alg); -} - -///--- API - -module.exports = { - - HASH_ALGOS: HASH_ALGOS, - PK_ALGOS: PK_ALGOS, - - HttpSignatureError: HttpSignatureError, - InvalidAlgorithmError: InvalidAlgorithmError, - - validateAlgorithm: validateAlgorithm, - - /** - * Converts an OpenSSH public key (rsa only) to a PKCS#8 PEM file. - * - * The intent of this module is to interoperate with OpenSSL only, - * specifically the node crypto module's `verify` method. - * - * @param {String} key an OpenSSH public key. - * @return {String} PEM encoded form of the RSA public key. - * @throws {TypeError} on bad input. - * @throws {Error} on invalid ssh key formatted data. - */ - sshKeyToPEM: function sshKeyToPEM(key) { - assert.string(key, 'ssh_key'); - - var k = sshpk.parseKey(key, 'ssh'); - return (k.toString('pem')); - }, - - - /** - * Generates an OpenSSH fingerprint from an ssh public key. - * - * @param {String} key an OpenSSH public key. - * @return {String} key fingerprint. - * @throws {TypeError} on bad input. - * @throws {Error} if what you passed doesn't look like an ssh public key. - */ - fingerprint: function fingerprint(key) { - assert.string(key, 'ssh_key'); - - var k = sshpk.parseKey(key, 'ssh'); - return (k.fingerprint('md5').toString('hex')); - }, - - /** - * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa) - * - * The reverse of the above function. - */ - pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) { - assert.equal('string', typeof (pem), 'typeof pem'); - - var k = sshpk.parseKey(pem, 'pem'); - k.comment = comment; - return (k.toString('ssh')); - } -}; - -},{"assert-plus":141,"sshpk":200,"util":undefined}],163:[function(require,module,exports){ -// Copyright 2015 Joyent, Inc. - -var assert = require('assert-plus'); -var crypto = require('crypto'); -var sshpk = require('sshpk'); -var utils = require('./utils'); - -var HASH_ALGOS = utils.HASH_ALGOS; -var PK_ALGOS = utils.PK_ALGOS; -var InvalidAlgorithmError = utils.InvalidAlgorithmError; -var HttpSignatureError = utils.HttpSignatureError; -var validateAlgorithm = utils.validateAlgorithm; - -///--- Exported API - -module.exports = { - /** - * Verify RSA/DSA signature against public key. You are expected to pass in - * an object that was returned from `parse()`. - * - * @param {Object} parsedSignature the object you got from `parse`. - * @param {String} pubkey RSA/DSA private key PEM. - * @return {Boolean} true if valid, false otherwise. - * @throws {TypeError} if you pass in bad arguments. - * @throws {InvalidAlgorithmError} - */ - verifySignature: function verifySignature(parsedSignature, pubkey) { - assert.object(parsedSignature, 'parsedSignature'); - if (typeof (pubkey) === 'string' || Buffer.isBuffer(pubkey)) - pubkey = sshpk.parseKey(pubkey); - assert.ok(sshpk.Key.isKey(pubkey, [1, 1]), 'pubkey must be a sshpk.Key'); - - var alg = validateAlgorithm(parsedSignature.algorithm); - if (alg[0] === 'hmac' || alg[0] !== pubkey.type) - return (false); - - var v = pubkey.createVerify(alg[1]); - v.update(parsedSignature.signingString); - return (v.verify(parsedSignature.params.signature, 'base64')); - }, - - /** - * Verify HMAC against shared secret. You are expected to pass in an object - * that was returned from `parse()`. - * - * @param {Object} parsedSignature the object you got from `parse`. - * @param {String} secret HMAC shared secret. - * @return {Boolean} true if valid, false otherwise. - * @throws {TypeError} if you pass in bad arguments. - * @throws {InvalidAlgorithmError} - */ - verifyHMAC: function verifyHMAC(parsedSignature, secret) { - assert.object(parsedSignature, 'parsedHMAC'); - assert.string(secret, 'secret'); - - var alg = validateAlgorithm(parsedSignature.algorithm); - if (alg[0] !== 'hmac') - return (false); - - var hashAlg = alg[1].toUpperCase(); - - var hmac = crypto.createHmac(hashAlg, secret); - hmac.update(parsedSignature.signingString); - - /* - * Now double-hash to avoid leaking timing information - there's - * no easy constant-time compare in JS, so we use this approach - * instead. See for more info: - * https://www.isecpartners.com/blog/2011/february/double-hmac- - * verification.aspx - */ - var h1 = crypto.createHmac(hashAlg, secret); - h1.update(hmac.digest()); - h1 = h1.digest(); - var h2 = crypto.createHmac(hashAlg, secret); - h2.update(new Buffer(parsedSignature.params.signature, 'base64')); - h2 = h2.digest(); - - /* Node 0.8 returns strings from .digest(). */ - if (typeof (h1) === 'string') - return (h1 === h2); - /* And node 0.10 lacks the .equals() method on Buffers. */ - if (Buffer.isBuffer(h1) && !h1.equals) - return (h1.toString('binary') === h2.toString('binary')); - - return (h1.equals(h2)); - } -}; - -},{"./utils":162,"assert-plus":141,"crypto":undefined,"sshpk":200}],164:[function(require,module,exports){ -'use strict'; - -var replace = String.prototype.replace; -var percentTwenties = /%20/g; - -module.exports = { - 'default': 'RFC3986', - formatters: { - RFC1738: function (value) { - return replace.call(value, percentTwenties, '+'); - }, - RFC3986: function (value) { - return value; - } - }, - RFC1738: 'RFC1738', - RFC3986: 'RFC3986' -}; - -},{}],165:[function(require,module,exports){ -'use strict'; - -var stringify = require('./stringify'); -var parse = require('./parse'); -var formats = require('./formats'); - -module.exports = { - formats: formats, - parse: parse, - stringify: stringify -}; - -},{"./formats":164,"./parse":166,"./stringify":167}],166:[function(require,module,exports){ -'use strict'; - -var utils = require('./utils'); - -var has = Object.prototype.hasOwnProperty; - -var defaults = { - allowDots: false, - allowPrototypes: false, - arrayLimit: 20, - decoder: utils.decode, - delimiter: '&', - depth: 5, - parameterLimit: 1000, - plainObjects: false, - strictNullHandling: false -}; - -var parseValues = function parseQueryStringValues(str, options) { - var obj = {}; - var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; - var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; - var parts = cleanStr.split(options.delimiter, limit); - - for (var i = 0; i < parts.length; ++i) { - var part = parts[i]; - - var bracketEqualsPos = part.indexOf(']='); - var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; - - var key, val; - if (pos === -1) { - key = options.decoder(part, defaults.decoder); - val = options.strictNullHandling ? null : ''; - } else { - key = options.decoder(part.slice(0, pos), defaults.decoder); - val = options.decoder(part.slice(pos + 1), defaults.decoder); - } - if (has.call(obj, key)) { - obj[key] = [].concat(obj[key]).concat(val); - } else { - obj[key] = val; - } - } - - return obj; -}; - -var parseObject = function (chain, val, options) { - var leaf = val; - - for (var i = chain.length - 1; i >= 0; --i) { - var obj; - var root = chain[i]; - - if (root === '[]') { - obj = []; - obj = obj.concat(leaf); - } else { - obj = options.plainObjects ? Object.create(null) : {}; - var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; - var index = parseInt(cleanRoot, 10); - if ( - !isNaN(index) - && root !== cleanRoot - && String(index) === cleanRoot - && index >= 0 - && (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = leaf; - } else { - obj[cleanRoot] = leaf; - } - } - - leaf = obj; - } - - return leaf; -}; - -var parseKeys = function parseQueryStringKeys(givenKey, val, options) { - if (!givenKey) { - return; - } - - // Transform dot notation to bracket notation - var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; - - // The regex chunks - - var brackets = /(\[[^[\]]*])/; - var child = /(\[[^[\]]*])/g; - - // Get the parent - - var segment = brackets.exec(key); - var parent = segment ? key.slice(0, segment.index) : key; - - // Stash the parent if it exists - - var keys = []; - if (parent) { - // If we aren't using plain objects, optionally prefix keys - // that would overwrite object prototype properties - if (!options.plainObjects && has.call(Object.prototype, parent)) { - if (!options.allowPrototypes) { - return; - } - } - - keys.push(parent); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - i += 1; - if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { - if (!options.allowPrototypes) { - return; - } - } - keys.push(segment[1]); - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return parseObject(keys, val, options); -}; - -module.exports = function (str, opts) { - var options = opts ? utils.assign({}, opts) : {}; - - if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { - throw new TypeError('Decoder has to be a function.'); - } - - options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; - options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; - options.parseArrays = options.parseArrays !== false; - options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; - options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; - options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; - options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; - options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - - if (str === '' || str === null || typeof str === 'undefined') { - return options.plainObjects ? Object.create(null) : {}; - } - - var tempObj = typeof str === 'string' ? parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - var newObj = parseKeys(key, tempObj[key], options); - obj = utils.merge(obj, newObj, options); - } - - return utils.compact(obj); -}; - -},{"./utils":168}],167:[function(require,module,exports){ -'use strict'; - -var utils = require('./utils'); -var formats = require('./formats'); - -var arrayPrefixGenerators = { - brackets: function brackets(prefix) { // eslint-disable-line func-name-matching - return prefix + '[]'; - }, - indices: function indices(prefix, key) { // eslint-disable-line func-name-matching - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { // eslint-disable-line func-name-matching - return prefix; - } -}; - -var toISO = Date.prototype.toISOString; - -var defaults = { - delimiter: '&', - encode: true, - encoder: utils.encode, - encodeValuesOnly: false, - serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var stringify = function stringify( // eslint-disable-line func-name-matching - object, - prefix, - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly -) { - var obj = object; - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } else if (obj instanceof Date) { - obj = serializeDate(obj); - } else if (obj === null) { - if (strictNullHandling) { - return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; - } - - obj = ''; - } - - if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { - if (encoder) { - var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); - return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; - } - return [formatter(prefix) + '=' + formatter(String(obj))]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys; - if (Array.isArray(filter)) { - objKeys = filter; - } else { - var keys = Object.keys(obj); - objKeys = sort ? keys.sort(sort) : keys; - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - if (Array.isArray(obj)) { - values = values.concat(stringify( - obj[key], - generateArrayPrefix(prefix, key), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } else { - values = values.concat(stringify( - obj[key], - prefix + (allowDots ? '.' + key : '[' + key + ']'), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } - } - - return values; -}; - -module.exports = function (object, opts) { - var obj = object; - var options = opts ? utils.assign({}, opts) : {}; - - if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { - throw new TypeError('Encoder has to be a function.'); - } - - var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; - var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; - var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; - var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; - var sort = typeof options.sort === 'function' ? options.sort : null; - var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; - var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; - var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; - if (typeof options.format === 'undefined') { - options.format = formats['default']; - } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { - throw new TypeError('Unknown format option provided.'); - } - var formatter = formats.formatters[options.format]; - var objKeys; - var filter; - - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } else if (Array.isArray(options.filter)) { - filter = options.filter; - objKeys = filter; - } - - var keys = []; - - if (typeof obj !== 'object' || obj === null) { - return ''; - } - - var arrayFormat; - if (options.arrayFormat in arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - - if (sort) { - objKeys.sort(sort); - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - keys = keys.concat(stringify( - obj[key], - key, - generateArrayPrefix, - strictNullHandling, - skipNulls, - encode ? encoder : null, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } - - var joined = keys.join(delimiter); - var prefix = options.addQueryPrefix === true ? '?' : ''; - - return joined.length > 0 ? prefix + joined : ''; -}; - -},{"./formats":164,"./utils":168}],168:[function(require,module,exports){ -'use strict'; - -var has = Object.prototype.hasOwnProperty; - -var hexTable = (function () { - var array = []; - for (var i = 0; i < 256; ++i) { - array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); - } - - return array; -}()); - -var compactQueue = function compactQueue(queue) { - var obj; - - while (queue.length) { - var item = queue.pop(); - obj = item.obj[item.prop]; - - if (Array.isArray(obj)) { - var compacted = []; - - for (var j = 0; j < obj.length; ++j) { - if (typeof obj[j] !== 'undefined') { - compacted.push(obj[j]); - } - } - - item.obj[item.prop] = compacted; - } - } - - return obj; -}; - -exports.arrayToObject = function arrayToObject(source, options) { - var obj = options && options.plainObjects ? Object.create(null) : {}; - for (var i = 0; i < source.length; ++i) { - if (typeof source[i] !== 'undefined') { - obj[i] = source[i]; - } - } - - return obj; -}; - -exports.merge = function merge(target, source, options) { - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } else if (typeof target === 'object') { - if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { - target[source] = true; - } - } else { - return [target, source]; - } - - return target; - } - - if (typeof target !== 'object') { - return [target].concat(source); - } - - var mergeTarget = target; - if (Array.isArray(target) && !Array.isArray(source)) { - mergeTarget = exports.arrayToObject(target, options); - } - - if (Array.isArray(target) && Array.isArray(source)) { - source.forEach(function (item, i) { - if (has.call(target, i)) { - if (target[i] && typeof target[i] === 'object') { - target[i] = exports.merge(target[i], item, options); - } else { - target.push(item); - } - } else { - target[i] = item; - } - }); - return target; - } - - return Object.keys(source).reduce(function (acc, key) { - var value = source[key]; - - if (has.call(acc, key)) { - acc[key] = exports.merge(acc[key], value, options); - } else { - acc[key] = value; - } - return acc; - }, mergeTarget); -}; - -exports.assign = function assignSingleSource(target, source) { - return Object.keys(source).reduce(function (acc, key) { - acc[key] = source[key]; - return acc; - }, target); -}; - -exports.decode = function (str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - -exports.encode = function encode(str) { - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } - - var string = typeof str === 'string' ? str : String(str); - - var out = ''; - for (var i = 0; i < string.length; ++i) { - var c = string.charCodeAt(i); - - if ( - c === 0x2D // - - || c === 0x2E // . - || c === 0x5F // _ - || c === 0x7E // ~ - || (c >= 0x30 && c <= 0x39) // 0-9 - || (c >= 0x41 && c <= 0x5A) // a-z - || (c >= 0x61 && c <= 0x7A) // A-Z - ) { - out += string.charAt(i); - continue; - } - - if (c < 0x80) { - out = out + hexTable[c]; - continue; - } - - if (c < 0x800) { - out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - if (c < 0xD800 || c >= 0xE000) { - out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - i += 1; - c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); - out += hexTable[0xF0 | (c >> 18)] - + hexTable[0x80 | ((c >> 12) & 0x3F)] - + hexTable[0x80 | ((c >> 6) & 0x3F)] - + hexTable[0x80 | (c & 0x3F)]; - } - - return out; -}; - -exports.compact = function compact(value) { - var queue = [{ obj: { o: value }, prop: 'o' }]; - var refs = []; - - for (var i = 0; i < queue.length; ++i) { - var item = queue[i]; - var obj = item.obj[item.prop]; - - var keys = Object.keys(obj); - for (var j = 0; j < keys.length; ++j) { - var key = keys[j]; - var val = obj[key]; - if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { - queue.push({ obj: obj, prop: key }); - refs.push(val); - } - } - } - - return compactQueue(queue); -}; - -exports.isRegExp = function isRegExp(obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - -exports.isBuffer = function isBuffer(obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); -}; - -},{}],169:[function(require,module,exports){ -'use strict'; - -// Load modules - -const Dgram = require('dgram'); -const Dns = require('dns'); - -const Hoek = require('hoek'); - - -// Declare internals - -const internals = {}; - - -exports.time = function (options, callback) { - - if (arguments.length !== 2) { - callback = arguments[0]; - options = {}; - } - - const settings = Hoek.clone(options); - settings.host = settings.host || 'time.google.com'; - settings.port = settings.port || 123; - settings.resolveReference = settings.resolveReference || false; - - // Declare variables used by callback - - let timeoutId = null; - let sent = 0; - - // Ensure callback is only called once - - const finish = Hoek.once((err, result) => { - - clearTimeout(timeoutId); - - socket.removeAllListeners(); - socket.once('error', Hoek.ignore); - - try { - socket.close(); - } - catch (ignoreErr) { } // Ignore errors if the socket is already closed - - return callback(err, result); - }); - - // Set timeout - - if (settings.timeout) { - timeoutId = setTimeout(() => { - - return finish(new Error('Timeout')); - }, settings.timeout); - } - - // Create UDP socket - - const socket = Dgram.createSocket('udp4'); - - socket.once('error', (err) => finish(err)); - - // Listen to incoming messages - - socket.on('message', (buffer, rinfo) => { - - const received = Date.now(); - - const message = new internals.NtpMessage(buffer); - if (!message.isValid) { - return finish(new Error('Invalid server response'), message); - } - - if (message.originateTimestamp !== sent) { - return finish(new Error('Wrong originate timestamp'), message); - } - - // Timestamp Name ID When Generated - // ------------------------------------------------------------ - // Originate Timestamp T1 time request sent by client - // Receive Timestamp T2 time request received by server - // Transmit Timestamp T3 time reply sent by server - // Destination Timestamp T4 time reply received by client - // - // The roundtrip delay d and system clock offset t are defined as: - // - // d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2 - - const T1 = message.originateTimestamp; - const T2 = message.receiveTimestamp; - const T3 = message.transmitTimestamp; - const T4 = received; - - message.d = (T4 - T1) - (T3 - T2); - message.t = ((T2 - T1) + (T3 - T4)) / 2; - message.receivedLocally = received; - - if (!settings.resolveReference || - message.stratum !== 'secondary') { - - return finish(null, message); - } - - // Resolve reference IP address - - Dns.reverse(message.referenceId, (err, domains) => { - - if (/* $lab:coverage:off$ */ !err /* $lab:coverage:on$ */) { - message.referenceHost = domains[0]; - } - - return finish(null, message); - }); - }); - - // Construct NTP message - - const message = new Buffer(48); - for (let i = 0; i < 48; ++i) { // Zero message - message[i] = 0; - } - - message[0] = (0 << 6) + (4 << 3) + (3 << 0); // Set version number to 4 and Mode to 3 (client) - sent = Date.now(); - internals.fromMsecs(sent, message, 40); // Set transmit timestamp (returns as originate) - - // Send NTP request - - socket.send(message, 0, message.length, settings.port, settings.host, (err, bytes) => { - - if (err || - bytes !== 48) { - - return finish(err || new Error('Could not send entire message')); - } - }); -}; - - -internals.NtpMessage = function (buffer) { - - this.isValid = false; - - // Validate - - if (buffer.length !== 48) { - return; - } - - // Leap indicator - - const li = (buffer[0] >> 6); - switch (li) { - case 0: this.leapIndicator = 'no-warning'; break; - case 1: this.leapIndicator = 'last-minute-61'; break; - case 2: this.leapIndicator = 'last-minute-59'; break; - case 3: this.leapIndicator = 'alarm'; break; - } - - // Version - - const vn = ((buffer[0] & 0x38) >> 3); - this.version = vn; - - // Mode - - const mode = (buffer[0] & 0x7); - switch (mode) { - case 1: this.mode = 'symmetric-active'; break; - case 2: this.mode = 'symmetric-passive'; break; - case 3: this.mode = 'client'; break; - case 4: this.mode = 'server'; break; - case 5: this.mode = 'broadcast'; break; - case 0: - case 6: - case 7: this.mode = 'reserved'; break; - } - - // Stratum - - const stratum = buffer[1]; - if (stratum === 0) { - this.stratum = 'death'; - } - else if (stratum === 1) { - this.stratum = 'primary'; - } - else if (stratum <= 15) { - this.stratum = 'secondary'; - } - else { - this.stratum = 'reserved'; - } - - // Poll interval (msec) - - this.pollInterval = Math.round(Math.pow(2, buffer[2])) * 1000; - - // Precision (msecs) - - this.precision = Math.pow(2, buffer[3]) * 1000; - - // Root delay (msecs) - - const rootDelay = 256 * (256 * (256 * buffer[4] + buffer[5]) + buffer[6]) + buffer[7]; - this.rootDelay = 1000 * (rootDelay / 0x10000); - - // Root dispersion (msecs) - - this.rootDispersion = ((buffer[8] << 8) + buffer[9] + ((buffer[10] << 8) + buffer[11]) / Math.pow(2, 16)) * 1000; - - // Reference identifier - - this.referenceId = ''; - switch (this.stratum) { - case 'death': - case 'primary': - this.referenceId = String.fromCharCode(buffer[12]) + String.fromCharCode(buffer[13]) + String.fromCharCode(buffer[14]) + String.fromCharCode(buffer[15]); - break; - case 'secondary': - this.referenceId = '' + buffer[12] + '.' + buffer[13] + '.' + buffer[14] + '.' + buffer[15]; - break; - } - - // Reference timestamp - - this.referenceTimestamp = internals.toMsecs(buffer, 16); - - // Originate timestamp - - this.originateTimestamp = internals.toMsecs(buffer, 24); - - // Receive timestamp - - this.receiveTimestamp = internals.toMsecs(buffer, 32); - - // Transmit timestamp - - this.transmitTimestamp = internals.toMsecs(buffer, 40); - - // Validate - - if (this.version === 4 && - this.stratum !== 'reserved' && - this.mode === 'server' && - this.originateTimestamp && - this.receiveTimestamp && - this.transmitTimestamp) { - - this.isValid = true; - } - - return this; -}; - - -internals.toMsecs = function (buffer, offset) { - - let seconds = 0; - let fraction = 0; - - for (let i = 0; i < 4; ++i) { - seconds = (seconds * 256) + buffer[offset + i]; - } - - for (let i = 4; i < 8; ++i) { - fraction = (fraction * 256) + buffer[offset + i]; - } - - return ((seconds - 2208988800 + (fraction / Math.pow(2, 32))) * 1000); -}; - - -internals.fromMsecs = function (ts, buffer, offset) { - - const seconds = Math.floor(ts / 1000) + 2208988800; - const fraction = Math.round((ts % 1000) / 1000 * Math.pow(2, 32)); - - buffer[offset + 0] = (seconds & 0xFF000000) >> 24; - buffer[offset + 1] = (seconds & 0x00FF0000) >> 16; - buffer[offset + 2] = (seconds & 0x0000FF00) >> 8; - buffer[offset + 3] = (seconds & 0x000000FF); - - buffer[offset + 4] = (fraction & 0xFF000000) >> 24; - buffer[offset + 5] = (fraction & 0x00FF0000) >> 16; - buffer[offset + 6] = (fraction & 0x0000FF00) >> 8; - buffer[offset + 7] = (fraction & 0x000000FF); -}; - - -// Offset singleton - -internals.last = { - offset: 0, - expires: 0, - host: '', - port: 0 -}; - - -exports.offset = function (options, callback) { - - if (arguments.length !== 2) { - callback = arguments[0]; - options = {}; - } - - const now = Date.now(); - const clockSyncRefresh = options.clockSyncRefresh || 24 * 60 * 60 * 1000; // Daily - - if (internals.last.offset && - internals.last.host === options.host && - internals.last.port === options.port && - now < internals.last.expires) { - - process.nextTick(() => callback(null, internals.last.offset)); - return; - } - - exports.time(options, (err, time) => { - - if (err) { - return callback(err, 0); - } - - internals.last = { - offset: Math.round(time.t), - expires: now + clockSyncRefresh, - host: options.host, - port: options.port - }; - - return callback(null, internals.last.offset); - }); -}; - - -// Now singleton - -internals.now = { - started: false, - intervalId: null -}; - - -exports.start = function (options, callback) { - - if (arguments.length !== 2) { - callback = arguments[0]; - options = {}; - } - - if (internals.now.started) { - process.nextTick(() => callback()); - return; - } - - const report = (err) => { - - if (err && - options.onError) { - - options.onError(err); - } - }; - - internals.now.started = true; - exports.offset(options, (err, offset) => { - - report(err); - - internals.now.intervalId = setInterval(() => { - - exports.offset(options, report); - }, options.clockSyncRefresh || 24 * 60 * 60 * 1000); // Daily - - return callback(); - }); -}; - - -exports.stop = function () { - - if (!internals.now.started) { - return; - } - - clearInterval(internals.now.intervalId); - internals.now.started = false; - internals.now.intervalId = null; -}; - - -exports.isLive = function () { - - return internals.now.started; -}; - - -exports.now = function () { - - const now = Date.now(); - if (!exports.isLive() || - now >= internals.last.expires) { - - return now; - } - - return now + internals.last.offset; -}; - -},{"dgram":undefined,"dns":undefined,"hoek":158}],170:[function(require,module,exports){ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of Salesforce.com nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -'use strict'; -var net = require('net'); -var urlParse = require('url').parse; -var pubsuffix = require('./pubsuffix'); -var Store = require('./store').Store; -var MemoryCookieStore = require('./memstore').MemoryCookieStore; -var pathMatch = require('./pathMatch').pathMatch; -var VERSION = require('../package.json').version; - -var punycode; -try { - punycode = require('punycode'); -} catch(e) { - console.warn("cookie: can't load punycode; won't use punycode for domain normalization"); -} - -// From RFC6265 S4.1.1 -// note that it excludes \x3B ";" -var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/; - -var CONTROL_CHARS = /[\x00-\x1F]/; - -// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in -// the "relaxed" mode, see: -// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60 -var TERMINATORS = ['\n', '\r', '\0']; - -// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"' -// Note ';' is \x3B -var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; - -// date-time parsing constants (RFC6265 S5.1.1) - -var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; - -var MONTH_TO_NUM = { - jan:0, feb:1, mar:2, apr:3, may:4, jun:5, - jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 -}; -var NUM_TO_MONTH = [ - 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' -]; -var NUM_TO_DAY = [ - 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' -]; - -var MAX_TIME = 2147483647000; // 31-bit max -var MIN_TIME = 0; // 31-bit min - -/* - * Parses a Natural number (i.e., non-negative integer) with either the - * *DIGIT ( non-digit *OCTET ) - * or - * *DIGIT - * grammar (RFC6265 S5.1.1). - * - * The "trailingOK" boolean controls if the grammar accepts a - * "( non-digit *OCTET )" trailer. - */ -function parseDigits(token, minDigits, maxDigits, trailingOK) { - var count = 0; - while (count < token.length) { - var c = token.charCodeAt(count); - // "non-digit = %x00-2F / %x3A-FF" - if (c <= 0x2F || c >= 0x3A) { - break; - } - count++; - } - - // constrain to a minimum and maximum number of digits. - if (count < minDigits || count > maxDigits) { - return null; - } - - if (!trailingOK && count != token.length) { - return null; - } - - return parseInt(token.substr(0,count), 10); -} - -function parseTime(token) { - var parts = token.split(':'); - var result = [0,0,0]; - - /* RF6256 S5.1.1: - * time = hms-time ( non-digit *OCTET ) - * hms-time = time-field ":" time-field ":" time-field - * time-field = 1*2DIGIT - */ - - if (parts.length !== 3) { - return null; - } - - for (var i = 0; i < 3; i++) { - // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be - // followed by "( non-digit *OCTET )" so therefore the last time-field can - // have a trailer - var trailingOK = (i == 2); - var num = parseDigits(parts[i], 1, 2, trailingOK); - if (num === null) { - return null; - } - result[i] = num; - } - - return result; -} - -function parseMonth(token) { - token = String(token).substr(0,3).toLowerCase(); - var num = MONTH_TO_NUM[token]; - return num >= 0 ? num : null; -} - -/* - * RFC6265 S5.1.1 date parser (see RFC for full grammar) - */ -function parseDate(str) { - if (!str) { - return; - } - - /* RFC6265 S5.1.1: - * 2. Process each date-token sequentially in the order the date-tokens - * appear in the cookie-date - */ - var tokens = str.split(DATE_DELIM); - if (!tokens) { - return; - } - - var hour = null; - var minute = null; - var second = null; - var dayOfMonth = null; - var month = null; - var year = null; - - for (var i=0; i= 70 && year <= 99) { - year += 1900; - } else if (year >= 0 && year <= 69) { - year += 2000; - } - } - } - } - - /* RFC 6265 S5.1.1 - * "5. Abort these steps and fail to parse the cookie-date if: - * * at least one of the found-day-of-month, found-month, found- - * year, or found-time flags is not set, - * * the day-of-month-value is less than 1 or greater than 31, - * * the year-value is less than 1601, - * * the hour-value is greater than 23, - * * the minute-value is greater than 59, or - * * the second-value is greater than 59. - * (Note that leap seconds cannot be represented in this syntax.)" - * - * So, in order as above: - */ - if ( - dayOfMonth === null || month === null || year === null || second === null || - dayOfMonth < 1 || dayOfMonth > 31 || - year < 1601 || - hour > 23 || - minute > 59 || - second > 59 - ) { - return; - } - - return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second)); -} - -function formatDate(date) { - var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d; - var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; - var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; - var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; - return NUM_TO_DAY[date.getUTCDay()] + ', ' + - d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ - h+':'+m+':'+s+' GMT'; -} - -// S5.1.2 Canonicalized Host Names -function canonicalDomain(str) { - if (str == null) { - return null; - } - str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . - - // convert to IDN if any non-ASCII characters - if (punycode && /[^\u0001-\u007f]/.test(str)) { - str = punycode.toASCII(str); - } - - return str.toLowerCase(); -} - -// S5.1.3 Domain Matching -function domainMatch(str, domStr, canonicalize) { - if (str == null || domStr == null) { - return null; - } - if (canonicalize !== false) { - str = canonicalDomain(str); - domStr = canonicalDomain(domStr); - } - - /* - * "The domain string and the string are identical. (Note that both the - * domain string and the string will have been canonicalized to lower case at - * this point)" - */ - if (str == domStr) { - return true; - } - - /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ - - /* "* The string is a host name (i.e., not an IP address)." */ - if (net.isIP(str)) { - return false; - } - - /* "* The domain string is a suffix of the string" */ - var idx = str.indexOf(domStr); - if (idx <= 0) { - return false; // it's a non-match (-1) or prefix (0) - } - - // e.g "a.b.c".indexOf("b.c") === 2 - // 5 === 3+2 - if (str.length !== domStr.length + idx) { // it's not a suffix - return false; - } - - /* "* The last character of the string that is not included in the domain - * string is a %x2E (".") character." */ - if (str.substr(idx-1,1) !== '.') { - return false; - } - - return true; -} - - -// RFC6265 S5.1.4 Paths and Path-Match - -/* - * "The user agent MUST use an algorithm equivalent to the following algorithm - * to compute the default-path of a cookie:" - * - * Assumption: the path (and not query part or absolute uri) is passed in. - */ -function defaultPath(path) { - // "2. If the uri-path is empty or if the first character of the uri-path is not - // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. - if (!path || path.substr(0,1) !== "/") { - return "/"; - } - - // "3. If the uri-path contains no more than one %x2F ("/") character, output - // %x2F ("/") and skip the remaining step." - if (path === "/") { - return path; - } - - var rightSlash = path.lastIndexOf("/"); - if (rightSlash === 0) { - return "/"; - } - - // "4. Output the characters of the uri-path from the first character up to, - // but not including, the right-most %x2F ("/")." - return path.slice(0, rightSlash); -} - -function trimTerminator(str) { - for (var t = 0; t < TERMINATORS.length; t++) { - var terminatorIdx = str.indexOf(TERMINATORS[t]); - if (terminatorIdx !== -1) { - str = str.substr(0,terminatorIdx); - } - } - - return str; -} - -function parseCookiePair(cookiePair, looseMode) { - cookiePair = trimTerminator(cookiePair); - - var firstEq = cookiePair.indexOf('='); - if (looseMode) { - if (firstEq === 0) { // '=' is immediately at start - cookiePair = cookiePair.substr(1); - firstEq = cookiePair.indexOf('='); // might still need to split on '=' - } - } else { // non-loose mode - if (firstEq <= 0) { // no '=' or is at start - return; // needs to have non-empty "cookie-name" - } - } - - var cookieName, cookieValue; - if (firstEq <= 0) { - cookieName = ""; - cookieValue = cookiePair.trim(); - } else { - cookieName = cookiePair.substr(0, firstEq).trim(); - cookieValue = cookiePair.substr(firstEq+1).trim(); - } - - if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) { - return; - } - - var c = new Cookie(); - c.key = cookieName; - c.value = cookieValue; - return c; -} - -function parse(str, options) { - if (!options || typeof options !== 'object') { - options = {}; - } - str = str.trim(); - - // We use a regex to parse the "name-value-pair" part of S5.2 - var firstSemi = str.indexOf(';'); // S5.2 step 1 - var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi); - var c = parseCookiePair(cookiePair, !!options.loose); - if (!c) { - return; - } - - if (firstSemi === -1) { - return c; - } - - // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string - // (including the %x3B (";") in question)." plus later on in the same section - // "discard the first ";" and trim". - var unparsed = str.slice(firstSemi + 1).trim(); - - // "If the unparsed-attributes string is empty, skip the rest of these - // steps." - if (unparsed.length === 0) { - return c; - } - - /* - * S5.2 says that when looping over the items "[p]rocess the attribute-name - * and attribute-value according to the requirements in the following - * subsections" for every item. Plus, for many of the individual attributes - * in S5.3 it says to use the "attribute-value of the last attribute in the - * cookie-attribute-list". Therefore, in this implementation, we overwrite - * the previous value. - */ - var cookie_avs = unparsed.split(';'); - while (cookie_avs.length) { - var av = cookie_avs.shift().trim(); - if (av.length === 0) { // happens if ";;" appears - continue; - } - var av_sep = av.indexOf('='); - var av_key, av_value; - - if (av_sep === -1) { - av_key = av; - av_value = null; - } else { - av_key = av.substr(0,av_sep); - av_value = av.substr(av_sep+1); - } - - av_key = av_key.trim().toLowerCase(); - - if (av_value) { - av_value = av_value.trim(); - } - - switch(av_key) { - case 'expires': // S5.2.1 - if (av_value) { - var exp = parseDate(av_value); - // "If the attribute-value failed to parse as a cookie date, ignore the - // cookie-av." - if (exp) { - // over and underflow not realistically a concern: V8's getTime() seems to - // store something larger than a 32-bit time_t (even with 32-bit node) - c.expires = exp; - } - } - break; - - case 'max-age': // S5.2.2 - if (av_value) { - // "If the first character of the attribute-value is not a DIGIT or a "-" - // character ...[or]... If the remainder of attribute-value contains a - // non-DIGIT character, ignore the cookie-av." - if (/^-?[0-9]+$/.test(av_value)) { - var delta = parseInt(av_value, 10); - // "If delta-seconds is less than or equal to zero (0), let expiry-time - // be the earliest representable date and time." - c.setMaxAge(delta); - } - } - break; - - case 'domain': // S5.2.3 - // "If the attribute-value is empty, the behavior is undefined. However, - // the user agent SHOULD ignore the cookie-av entirely." - if (av_value) { - // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E - // (".") character." - var domain = av_value.trim().replace(/^\./, ''); - if (domain) { - // "Convert the cookie-domain to lower case." - c.domain = domain.toLowerCase(); - } - } - break; - - case 'path': // S5.2.4 - /* - * "If the attribute-value is empty or if the first character of the - * attribute-value is not %x2F ("/"): - * Let cookie-path be the default-path. - * Otherwise: - * Let cookie-path be the attribute-value." - * - * We'll represent the default-path as null since it depends on the - * context of the parsing. - */ - c.path = av_value && av_value[0] === "/" ? av_value : null; - break; - - case 'secure': // S5.2.5 - /* - * "If the attribute-name case-insensitively matches the string "Secure", - * the user agent MUST append an attribute to the cookie-attribute-list - * with an attribute-name of Secure and an empty attribute-value." - */ - c.secure = true; - break; - - case 'httponly': // S5.2.6 -- effectively the same as 'secure' - c.httpOnly = true; - break; - - default: - c.extensions = c.extensions || []; - c.extensions.push(av); - break; - } - } - - return c; -} - -// avoid the V8 deoptimization monster! -function jsonParse(str) { - var obj; - try { - obj = JSON.parse(str); - } catch (e) { - return e; - } - return obj; -} - -function fromJSON(str) { - if (!str) { - return null; - } - - var obj; - if (typeof str === 'string') { - obj = jsonParse(str); - if (obj instanceof Error) { - return null; - } - } else { - // assume it's an Object - obj = str; - } - - var c = new Cookie(); - for (var i=0; i 1) { - var lindex = path.lastIndexOf('/'); - if (lindex === 0) { - break; - } - path = path.substr(0,lindex); - permutations.push(path); - } - permutations.push('/'); - return permutations; -} - -function getCookieContext(url) { - if (url instanceof Object) { - return url; - } - // NOTE: decodeURI will throw on malformed URIs (see GH-32). - // Therefore, we will just skip decoding for such URIs. - try { - url = decodeURI(url); - } - catch(err) { - // Silently swallow error - } - - return urlParse(url); -} - -function Cookie(options) { - options = options || {}; - - Object.keys(options).forEach(function(prop) { - if (Cookie.prototype.hasOwnProperty(prop) && - Cookie.prototype[prop] !== options[prop] && - prop.substr(0,1) !== '_') - { - this[prop] = options[prop]; - } - }, this); - - this.creation = this.creation || new Date(); - - // used to break creation ties in cookieCompare(): - Object.defineProperty(this, 'creationIndex', { - configurable: false, - enumerable: false, // important for assert.deepEqual checks - writable: true, - value: ++Cookie.cookiesCreated - }); -} - -Cookie.cookiesCreated = 0; // incremented each time a cookie is created - -Cookie.parse = parse; -Cookie.fromJSON = fromJSON; - -Cookie.prototype.key = ""; -Cookie.prototype.value = ""; - -// the order in which the RFC has them: -Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity -Cookie.prototype.maxAge = null; // takes precedence over expires for TTL -Cookie.prototype.domain = null; -Cookie.prototype.path = null; -Cookie.prototype.secure = false; -Cookie.prototype.httpOnly = false; -Cookie.prototype.extensions = null; - -// set by the CookieJar: -Cookie.prototype.hostOnly = null; // boolean when set -Cookie.prototype.pathIsDefault = null; // boolean when set -Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse -Cookie.prototype.lastAccessed = null; // Date when set -Object.defineProperty(Cookie.prototype, 'creationIndex', { - configurable: true, - enumerable: false, - writable: true, - value: 0 -}); - -Cookie.serializableProperties = Object.keys(Cookie.prototype) - .filter(function(prop) { - return !( - Cookie.prototype[prop] instanceof Function || - prop === 'creationIndex' || - prop.substr(0,1) === '_' - ); - }); - -Cookie.prototype.inspect = function inspect() { - var now = Date.now(); - return 'Cookie="'+this.toString() + - '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + - '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + - '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + - '"'; -}; - -Cookie.prototype.toJSON = function() { - var obj = {}; - - var props = Cookie.serializableProperties; - for (var i=0; i suffixLen) { - var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.'); - return converted ? punycode.toUnicode(publicSuffix) : publicSuffix; - } - - return null; -}; - -// The following generated structure is used under the MPL version 2.0 -// See public-suffix.txt for more information - -var index = module.exports.index = Object.freeze( -{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"ar":true,"com.ar":true,"edu.ar":true,"gob.ar":true,"gov.ar":true,"int.ar":true,"mil.ar":true,"musica.ar":true,"net.ar":true,"org.ar":true,"tur.ar":true,"arpa":true,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"au":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"com.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"net.ba":true,"org.ba":true,"bb":true,"biz.bb":true,"co.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"tv.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"web.bo":true,"academia.bo":true,"agro.bo":true,"arte.bo":true,"blog.bo":true,"bolivia.bo":true,"ciencia.bo":true,"cooperativa.bo":true,"democracia.bo":true,"deporte.bo":true,"ecologia.bo":true,"economia.bo":true,"empresa.bo":true,"indigena.bo":true,"industria.bo":true,"info.bo":true,"medicina.bo":true,"movimiento.bo":true,"musica.bo":true,"natural.bo":true,"nombre.bo":true,"noticias.bo":true,"patria.bo":true,"politica.bo":true,"profesional.bo":true,"plurinacional.bo":true,"pueblo.bo":true,"revista.bo":true,"salud.bo":true,"tecnologia.bo":true,"tksat.bo":true,"transporte.bo":true,"wiki.bo":true,"br":true,"9guacu.br":true,"abc.br":true,"adm.br":true,"adv.br":true,"agr.br":true,"aju.br":true,"am.br":true,"anani.br":true,"aparecida.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"belem.br":true,"bhz.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"boavista.br":true,"bsb.br":true,"campinagrande.br":true,"campinas.br":true,"caxias.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"contagem.br":true,"coop.br":true,"cri.br":true,"cuiaba.br":true,"curitiba.br":true,"def.br":true,"ecn.br":true,"eco.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"feira.br":true,"flog.br":true,"floripa.br":true,"fm.br":true,"fnd.br":true,"fortal.br":true,"fot.br":true,"foz.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"goiania.br":true,"gov.br":true,"ac.gov.br":true,"al.gov.br":true,"am.gov.br":true,"ap.gov.br":true,"ba.gov.br":true,"ce.gov.br":true,"df.gov.br":true,"es.gov.br":true,"go.gov.br":true,"ma.gov.br":true,"mg.gov.br":true,"ms.gov.br":true,"mt.gov.br":true,"pa.gov.br":true,"pb.gov.br":true,"pe.gov.br":true,"pi.gov.br":true,"pr.gov.br":true,"rj.gov.br":true,"rn.gov.br":true,"ro.gov.br":true,"rr.gov.br":true,"rs.gov.br":true,"sc.gov.br":true,"se.gov.br":true,"sp.gov.br":true,"to.gov.br":true,"gru.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jab.br":true,"jampa.br":true,"jdf.br":true,"joinville.br":true,"jor.br":true,"jus.br":true,"leg.br":true,"lel.br":true,"londrina.br":true,"macapa.br":true,"maceio.br":true,"manaus.br":true,"maringa.br":true,"mat.br":true,"med.br":true,"mil.br":true,"morena.br":true,"mp.br":true,"mus.br":true,"natal.br":true,"net.br":true,"niteroi.br":true,"*.nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"osasco.br":true,"palmas.br":true,"poa.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"pvh.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"recife.br":true,"ribeirao.br":true,"rio.br":true,"riobranco.br":true,"riopreto.br":true,"salvador.br":true,"sampa.br":true,"santamaria.br":true,"santoandre.br":true,"saobernardo.br":true,"saogonca.br":true,"sjc.br":true,"slg.br":true,"slz.br":true,"sorocaba.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"the.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"udi.br":true,"vet.br":true,"vix.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bv":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"co.cm":true,"com.cm":true,"gov.cm":true,"net.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cw":true,"com.cw":true,"edu.cw":true,"net.cw":true,"org.cw":true,"cx":true,"gov.cx":true,"cy":true,"ac.cy":true,"biz.cy":true,"com.cy":true,"ekloges.cy":true,"gov.cy":true,"ltd.cy":true,"name.cy":true,"net.cy":true,"org.cy":true,"parliament.cy":true,"press.cy":true,"pro.cy":true,"tm.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"et":true,"com.et":true,"gov.et":true,"org.et":true,"edu.et":true,"biz.et":true,"name.et":true,"info.et":true,"net.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gb":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"net.gg":true,"org.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"co.gl":true,"com.gl":true,"edu.gl":true,"net.gl":true,"org.gl":true,"gm":true,"gn":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"gt":true,"com.gt":true,"edu.gt":true,"gob.gt":true,"ind.gt":true,"mil.gt":true,"net.gt":true,"org.gt":true,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"edu.gy":true,"gov.gy":true,"net.gy":true,"org.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"biz.id":true,"co.id":true,"desa.id":true,"go.id":true,"mil.id":true,"my.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"il":true,"ac.il":true,"co.il":true,"gov.il":true,"idf.il":true,"k12.il":true,"muni.il":true,"net.il":true,"org.il":true,"im":true,"ac.im":true,"co.im":true,"com.im":true,"ltd.co.im":true,"net.im":true,"org.im":true,"plc.co.im":true,"tt.im":true,"tv.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"abr.it":true,"abruzzo.it":true,"aosta-valley.it":true,"aostavalley.it":true,"bas.it":true,"basilicata.it":true,"cal.it":true,"calabria.it":true,"cam.it":true,"campania.it":true,"emilia-romagna.it":true,"emiliaromagna.it":true,"emr.it":true,"friuli-v-giulia.it":true,"friuli-ve-giulia.it":true,"friuli-vegiulia.it":true,"friuli-venezia-giulia.it":true,"friuli-veneziagiulia.it":true,"friuli-vgiulia.it":true,"friuliv-giulia.it":true,"friulive-giulia.it":true,"friulivegiulia.it":true,"friulivenezia-giulia.it":true,"friuliveneziagiulia.it":true,"friulivgiulia.it":true,"fvg.it":true,"laz.it":true,"lazio.it":true,"lig.it":true,"liguria.it":true,"lom.it":true,"lombardia.it":true,"lombardy.it":true,"lucania.it":true,"mar.it":true,"marche.it":true,"mol.it":true,"molise.it":true,"piedmont.it":true,"piemonte.it":true,"pmn.it":true,"pug.it":true,"puglia.it":true,"sar.it":true,"sardegna.it":true,"sardinia.it":true,"sic.it":true,"sicilia.it":true,"sicily.it":true,"taa.it":true,"tos.it":true,"toscana.it":true,"trentino-a-adige.it":true,"trentino-aadige.it":true,"trentino-alto-adige.it":true,"trentino-altoadige.it":true,"trentino-s-tirol.it":true,"trentino-stirol.it":true,"trentino-sud-tirol.it":true,"trentino-sudtirol.it":true,"trentino-sued-tirol.it":true,"trentino-suedtirol.it":true,"trentinoa-adige.it":true,"trentinoaadige.it":true,"trentinoalto-adige.it":true,"trentinoaltoadige.it":true,"trentinos-tirol.it":true,"trentinostirol.it":true,"trentinosud-tirol.it":true,"trentinosudtirol.it":true,"trentinosued-tirol.it":true,"trentinosuedtirol.it":true,"tuscany.it":true,"umb.it":true,"umbria.it":true,"val-d-aosta.it":true,"val-daosta.it":true,"vald-aosta.it":true,"valdaosta.it":true,"valle-aosta.it":true,"valle-d-aosta.it":true,"valle-daosta.it":true,"valleaosta.it":true,"valled-aosta.it":true,"valledaosta.it":true,"vallee-aoste.it":true,"valleeaoste.it":true,"vao.it":true,"vda.it":true,"ven.it":true,"veneto.it":true,"ag.it":true,"agrigento.it":true,"al.it":true,"alessandria.it":true,"alto-adige.it":true,"altoadige.it":true,"an.it":true,"ancona.it":true,"andria-barletta-trani.it":true,"andria-trani-barletta.it":true,"andriabarlettatrani.it":true,"andriatranibarletta.it":true,"ao.it":true,"aosta.it":true,"aoste.it":true,"ap.it":true,"aq.it":true,"aquila.it":true,"ar.it":true,"arezzo.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"asti.it":true,"at.it":true,"av.it":true,"avellino.it":true,"ba.it":true,"balsan.it":true,"bari.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"belluno.it":true,"benevento.it":true,"bergamo.it":true,"bg.it":true,"bi.it":true,"biella.it":true,"bl.it":true,"bn.it":true,"bo.it":true,"bologna.it":true,"bolzano.it":true,"bozen.it":true,"br.it":true,"brescia.it":true,"brindisi.it":true,"bs.it":true,"bt.it":true,"bz.it":true,"ca.it":true,"cagliari.it":true,"caltanissetta.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"campobasso.it":true,"carbonia-iglesias.it":true,"carboniaiglesias.it":true,"carrara-massa.it":true,"carraramassa.it":true,"caserta.it":true,"catania.it":true,"catanzaro.it":true,"cb.it":true,"ce.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"ch.it":true,"chieti.it":true,"ci.it":true,"cl.it":true,"cn.it":true,"co.it":true,"como.it":true,"cosenza.it":true,"cr.it":true,"cremona.it":true,"crotone.it":true,"cs.it":true,"ct.it":true,"cuneo.it":true,"cz.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"en.it":true,"enna.it":true,"fc.it":true,"fe.it":true,"fermo.it":true,"ferrara.it":true,"fg.it":true,"fi.it":true,"firenze.it":true,"florence.it":true,"fm.it":true,"foggia.it":true,"forli-cesena.it":true,"forlicesena.it":true,"fr.it":true,"frosinone.it":true,"ge.it":true,"genoa.it":true,"genova.it":true,"go.it":true,"gorizia.it":true,"gr.it":true,"grosseto.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"im.it":true,"imperia.it":true,"is.it":true,"isernia.it":true,"kr.it":true,"la-spezia.it":true,"laquila.it":true,"laspezia.it":true,"latina.it":true,"lc.it":true,"le.it":true,"lecce.it":true,"lecco.it":true,"li.it":true,"livorno.it":true,"lo.it":true,"lodi.it":true,"lt.it":true,"lu.it":true,"lucca.it":true,"macerata.it":true,"mantova.it":true,"massa-carrara.it":true,"massacarrara.it":true,"matera.it":true,"mb.it":true,"mc.it":true,"me.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"messina.it":true,"mi.it":true,"milan.it":true,"milano.it":true,"mn.it":true,"mo.it":true,"modena.it":true,"monza-brianza.it":true,"monza-e-della-brianza.it":true,"monza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"ms.it":true,"mt.it":true,"na.it":true,"naples.it":true,"napoli.it":true,"no.it":true,"novara.it":true,"nu.it":true,"nuoro.it":true,"og.it":true,"ogliastra.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"or.it":true,"oristano.it":true,"ot.it":true,"pa.it":true,"padova.it":true,"padua.it":true,"palermo.it":true,"parma.it":true,"pavia.it":true,"pc.it":true,"pd.it":true,"pe.it":true,"perugia.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"pescara.it":true,"pg.it":true,"pi.it":true,"piacenza.it":true,"pisa.it":true,"pistoia.it":true,"pn.it":true,"po.it":true,"pordenone.it":true,"potenza.it":true,"pr.it":true,"prato.it":true,"pt.it":true,"pu.it":true,"pv.it":true,"pz.it":true,"ra.it":true,"ragusa.it":true,"ravenna.it":true,"rc.it":true,"re.it":true,"reggio-calabria.it":true,"reggio-emilia.it":true,"reggiocalabria.it":true,"reggioemilia.it":true,"rg.it":true,"ri.it":true,"rieti.it":true,"rimini.it":true,"rm.it":true,"rn.it":true,"ro.it":true,"roma.it":true,"rome.it":true,"rovigo.it":true,"sa.it":true,"salerno.it":true,"sassari.it":true,"savona.it":true,"si.it":true,"siena.it":true,"siracusa.it":true,"so.it":true,"sondrio.it":true,"sp.it":true,"sr.it":true,"ss.it":true,"suedtirol.it":true,"sv.it":true,"ta.it":true,"taranto.it":true,"te.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"teramo.it":true,"terni.it":true,"tn.it":true,"to.it":true,"torino.it":true,"tp.it":true,"tr.it":true,"trani-andria-barletta.it":true,"trani-barletta-andria.it":true,"traniandriabarletta.it":true,"tranibarlettaandria.it":true,"trapani.it":true,"trentino.it":true,"trento.it":true,"treviso.it":true,"trieste.it":true,"ts.it":true,"turin.it":true,"tv.it":true,"ud.it":true,"udine.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"va.it":true,"varese.it":true,"vb.it":true,"vc.it":true,"ve.it":true,"venezia.it":true,"venice.it":true,"verbania.it":true,"vercelli.it":true,"verona.it":true,"vi.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vicenza.it":true,"viterbo.it":true,"vr.it":true,"vs.it":true,"vt.it":true,"vv.it":true,"je":true,"co.je":true,"net.je":true,"org.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"aichi.jp":true,"akita.jp":true,"aomori.jp":true,"chiba.jp":true,"ehime.jp":true,"fukui.jp":true,"fukuoka.jp":true,"fukushima.jp":true,"gifu.jp":true,"gunma.jp":true,"hiroshima.jp":true,"hokkaido.jp":true,"hyogo.jp":true,"ibaraki.jp":true,"ishikawa.jp":true,"iwate.jp":true,"kagawa.jp":true,"kagoshima.jp":true,"kanagawa.jp":true,"kochi.jp":true,"kumamoto.jp":true,"kyoto.jp":true,"mie.jp":true,"miyagi.jp":true,"miyazaki.jp":true,"nagano.jp":true,"nagasaki.jp":true,"nara.jp":true,"niigata.jp":true,"oita.jp":true,"okayama.jp":true,"okinawa.jp":true,"osaka.jp":true,"saga.jp":true,"saitama.jp":true,"shiga.jp":true,"shimane.jp":true,"shizuoka.jp":true,"tochigi.jp":true,"tokushima.jp":true,"tokyo.jp":true,"tottori.jp":true,"toyama.jp":true,"wakayama.jp":true,"yamagata.jp":true,"yamaguchi.jp":true,"yamanashi.jp":true,"xn--4pvxs.jp":true,"xn--vgu402c.jp":true,"xn--c3s14m.jp":true,"xn--f6qx53a.jp":true,"xn--8pvr4u.jp":true,"xn--uist22h.jp":true,"xn--djrs72d6uy.jp":true,"xn--mkru45i.jp":true,"xn--0trq7p7nn.jp":true,"xn--8ltr62k.jp":true,"xn--2m4a15e.jp":true,"xn--efvn9s.jp":true,"xn--32vp30h.jp":true,"xn--4it797k.jp":true,"xn--1lqs71d.jp":true,"xn--5rtp49c.jp":true,"xn--5js045d.jp":true,"xn--ehqz56n.jp":true,"xn--1lqs03n.jp":true,"xn--qqqt11m.jp":true,"xn--kbrq7o.jp":true,"xn--pssu33l.jp":true,"xn--ntsq17g.jp":true,"xn--uisz3g.jp":true,"xn--6btw5a.jp":true,"xn--1ctwo.jp":true,"xn--6orx2r.jp":true,"xn--rht61e.jp":true,"xn--rht27z.jp":true,"xn--djty4k.jp":true,"xn--nit225k.jp":true,"xn--rht3d.jp":true,"xn--klty5x.jp":true,"xn--kltx9a.jp":true,"xn--kltp7d.jp":true,"xn--uuwu58a.jp":true,"xn--zbx025d.jp":true,"xn--ntso0iqx3a.jp":true,"xn--elqq16h.jp":true,"xn--4it168d.jp":true,"xn--klt787d.jp":true,"xn--rny31h.jp":true,"xn--7t0a264c.jp":true,"xn--5rtq34k.jp":true,"xn--k7yn95e.jp":true,"xn--tor131o.jp":true,"xn--d5qv7z876c.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.nagoya.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.yokohama.jp":true,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.nagoya.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.yokohama.jp":false,"aisai.aichi.jp":true,"ama.aichi.jp":true,"anjo.aichi.jp":true,"asuke.aichi.jp":true,"chiryu.aichi.jp":true,"chita.aichi.jp":true,"fuso.aichi.jp":true,"gamagori.aichi.jp":true,"handa.aichi.jp":true,"hazu.aichi.jp":true,"hekinan.aichi.jp":true,"higashiura.aichi.jp":true,"ichinomiya.aichi.jp":true,"inazawa.aichi.jp":true,"inuyama.aichi.jp":true,"isshiki.aichi.jp":true,"iwakura.aichi.jp":true,"kanie.aichi.jp":true,"kariya.aichi.jp":true,"kasugai.aichi.jp":true,"kira.aichi.jp":true,"kiyosu.aichi.jp":true,"komaki.aichi.jp":true,"konan.aichi.jp":true,"kota.aichi.jp":true,"mihama.aichi.jp":true,"miyoshi.aichi.jp":true,"nishio.aichi.jp":true,"nisshin.aichi.jp":true,"obu.aichi.jp":true,"oguchi.aichi.jp":true,"oharu.aichi.jp":true,"okazaki.aichi.jp":true,"owariasahi.aichi.jp":true,"seto.aichi.jp":true,"shikatsu.aichi.jp":true,"shinshiro.aichi.jp":true,"shitara.aichi.jp":true,"tahara.aichi.jp":true,"takahama.aichi.jp":true,"tobishima.aichi.jp":true,"toei.aichi.jp":true,"togo.aichi.jp":true,"tokai.aichi.jp":true,"tokoname.aichi.jp":true,"toyoake.aichi.jp":true,"toyohashi.aichi.jp":true,"toyokawa.aichi.jp":true,"toyone.aichi.jp":true,"toyota.aichi.jp":true,"tsushima.aichi.jp":true,"yatomi.aichi.jp":true,"akita.akita.jp":true,"daisen.akita.jp":true,"fujisato.akita.jp":true,"gojome.akita.jp":true,"hachirogata.akita.jp":true,"happou.akita.jp":true,"higashinaruse.akita.jp":true,"honjo.akita.jp":true,"honjyo.akita.jp":true,"ikawa.akita.jp":true,"kamikoani.akita.jp":true,"kamioka.akita.jp":true,"katagami.akita.jp":true,"kazuno.akita.jp":true,"kitaakita.akita.jp":true,"kosaka.akita.jp":true,"kyowa.akita.jp":true,"misato.akita.jp":true,"mitane.akita.jp":true,"moriyoshi.akita.jp":true,"nikaho.akita.jp":true,"noshiro.akita.jp":true,"odate.akita.jp":true,"oga.akita.jp":true,"ogata.akita.jp":true,"semboku.akita.jp":true,"yokote.akita.jp":true,"yurihonjo.akita.jp":true,"aomori.aomori.jp":true,"gonohe.aomori.jp":true,"hachinohe.aomori.jp":true,"hashikami.aomori.jp":true,"hiranai.aomori.jp":true,"hirosaki.aomori.jp":true,"itayanagi.aomori.jp":true,"kuroishi.aomori.jp":true,"misawa.aomori.jp":true,"mutsu.aomori.jp":true,"nakadomari.aomori.jp":true,"noheji.aomori.jp":true,"oirase.aomori.jp":true,"owani.aomori.jp":true,"rokunohe.aomori.jp":true,"sannohe.aomori.jp":true,"shichinohe.aomori.jp":true,"shingo.aomori.jp":true,"takko.aomori.jp":true,"towada.aomori.jp":true,"tsugaru.aomori.jp":true,"tsuruta.aomori.jp":true,"abiko.chiba.jp":true,"asahi.chiba.jp":true,"chonan.chiba.jp":true,"chosei.chiba.jp":true,"choshi.chiba.jp":true,"chuo.chiba.jp":true,"funabashi.chiba.jp":true,"futtsu.chiba.jp":true,"hanamigawa.chiba.jp":true,"ichihara.chiba.jp":true,"ichikawa.chiba.jp":true,"ichinomiya.chiba.jp":true,"inzai.chiba.jp":true,"isumi.chiba.jp":true,"kamagaya.chiba.jp":true,"kamogawa.chiba.jp":true,"kashiwa.chiba.jp":true,"katori.chiba.jp":true,"katsuura.chiba.jp":true,"kimitsu.chiba.jp":true,"kisarazu.chiba.jp":true,"kozaki.chiba.jp":true,"kujukuri.chiba.jp":true,"kyonan.chiba.jp":true,"matsudo.chiba.jp":true,"midori.chiba.jp":true,"mihama.chiba.jp":true,"minamiboso.chiba.jp":true,"mobara.chiba.jp":true,"mutsuzawa.chiba.jp":true,"nagara.chiba.jp":true,"nagareyama.chiba.jp":true,"narashino.chiba.jp":true,"narita.chiba.jp":true,"noda.chiba.jp":true,"oamishirasato.chiba.jp":true,"omigawa.chiba.jp":true,"onjuku.chiba.jp":true,"otaki.chiba.jp":true,"sakae.chiba.jp":true,"sakura.chiba.jp":true,"shimofusa.chiba.jp":true,"shirako.chiba.jp":true,"shiroi.chiba.jp":true,"shisui.chiba.jp":true,"sodegaura.chiba.jp":true,"sosa.chiba.jp":true,"tako.chiba.jp":true,"tateyama.chiba.jp":true,"togane.chiba.jp":true,"tohnosho.chiba.jp":true,"tomisato.chiba.jp":true,"urayasu.chiba.jp":true,"yachimata.chiba.jp":true,"yachiyo.chiba.jp":true,"yokaichiba.chiba.jp":true,"yokoshibahikari.chiba.jp":true,"yotsukaido.chiba.jp":true,"ainan.ehime.jp":true,"honai.ehime.jp":true,"ikata.ehime.jp":true,"imabari.ehime.jp":true,"iyo.ehime.jp":true,"kamijima.ehime.jp":true,"kihoku.ehime.jp":true,"kumakogen.ehime.jp":true,"masaki.ehime.jp":true,"matsuno.ehime.jp":true,"matsuyama.ehime.jp":true,"namikata.ehime.jp":true,"niihama.ehime.jp":true,"ozu.ehime.jp":true,"saijo.ehime.jp":true,"seiyo.ehime.jp":true,"shikokuchuo.ehime.jp":true,"tobe.ehime.jp":true,"toon.ehime.jp":true,"uchiko.ehime.jp":true,"uwajima.ehime.jp":true,"yawatahama.ehime.jp":true,"echizen.fukui.jp":true,"eiheiji.fukui.jp":true,"fukui.fukui.jp":true,"ikeda.fukui.jp":true,"katsuyama.fukui.jp":true,"mihama.fukui.jp":true,"minamiechizen.fukui.jp":true,"obama.fukui.jp":true,"ohi.fukui.jp":true,"ono.fukui.jp":true,"sabae.fukui.jp":true,"sakai.fukui.jp":true,"takahama.fukui.jp":true,"tsuruga.fukui.jp":true,"wakasa.fukui.jp":true,"ashiya.fukuoka.jp":true,"buzen.fukuoka.jp":true,"chikugo.fukuoka.jp":true,"chikuho.fukuoka.jp":true,"chikujo.fukuoka.jp":true,"chikushino.fukuoka.jp":true,"chikuzen.fukuoka.jp":true,"chuo.fukuoka.jp":true,"dazaifu.fukuoka.jp":true,"fukuchi.fukuoka.jp":true,"hakata.fukuoka.jp":true,"higashi.fukuoka.jp":true,"hirokawa.fukuoka.jp":true,"hisayama.fukuoka.jp":true,"iizuka.fukuoka.jp":true,"inatsuki.fukuoka.jp":true,"kaho.fukuoka.jp":true,"kasuga.fukuoka.jp":true,"kasuya.fukuoka.jp":true,"kawara.fukuoka.jp":true,"keisen.fukuoka.jp":true,"koga.fukuoka.jp":true,"kurate.fukuoka.jp":true,"kurogi.fukuoka.jp":true,"kurume.fukuoka.jp":true,"minami.fukuoka.jp":true,"miyako.fukuoka.jp":true,"miyama.fukuoka.jp":true,"miyawaka.fukuoka.jp":true,"mizumaki.fukuoka.jp":true,"munakata.fukuoka.jp":true,"nakagawa.fukuoka.jp":true,"nakama.fukuoka.jp":true,"nishi.fukuoka.jp":true,"nogata.fukuoka.jp":true,"ogori.fukuoka.jp":true,"okagaki.fukuoka.jp":true,"okawa.fukuoka.jp":true,"oki.fukuoka.jp":true,"omuta.fukuoka.jp":true,"onga.fukuoka.jp":true,"onojo.fukuoka.jp":true,"oto.fukuoka.jp":true,"saigawa.fukuoka.jp":true,"sasaguri.fukuoka.jp":true,"shingu.fukuoka.jp":true,"shinyoshitomi.fukuoka.jp":true,"shonai.fukuoka.jp":true,"soeda.fukuoka.jp":true,"sue.fukuoka.jp":true,"tachiarai.fukuoka.jp":true,"tagawa.fukuoka.jp":true,"takata.fukuoka.jp":true,"toho.fukuoka.jp":true,"toyotsu.fukuoka.jp":true,"tsuiki.fukuoka.jp":true,"ukiha.fukuoka.jp":true,"umi.fukuoka.jp":true,"usui.fukuoka.jp":true,"yamada.fukuoka.jp":true,"yame.fukuoka.jp":true,"yanagawa.fukuoka.jp":true,"yukuhashi.fukuoka.jp":true,"aizubange.fukushima.jp":true,"aizumisato.fukushima.jp":true,"aizuwakamatsu.fukushima.jp":true,"asakawa.fukushima.jp":true,"bandai.fukushima.jp":true,"date.fukushima.jp":true,"fukushima.fukushima.jp":true,"furudono.fukushima.jp":true,"futaba.fukushima.jp":true,"hanawa.fukushima.jp":true,"higashi.fukushima.jp":true,"hirata.fukushima.jp":true,"hirono.fukushima.jp":true,"iitate.fukushima.jp":true,"inawashiro.fukushima.jp":true,"ishikawa.fukushima.jp":true,"iwaki.fukushima.jp":true,"izumizaki.fukushima.jp":true,"kagamiishi.fukushima.jp":true,"kaneyama.fukushima.jp":true,"kawamata.fukushima.jp":true,"kitakata.fukushima.jp":true,"kitashiobara.fukushima.jp":true,"koori.fukushima.jp":true,"koriyama.fukushima.jp":true,"kunimi.fukushima.jp":true,"miharu.fukushima.jp":true,"mishima.fukushima.jp":true,"namie.fukushima.jp":true,"nango.fukushima.jp":true,"nishiaizu.fukushima.jp":true,"nishigo.fukushima.jp":true,"okuma.fukushima.jp":true,"omotego.fukushima.jp":true,"ono.fukushima.jp":true,"otama.fukushima.jp":true,"samegawa.fukushima.jp":true,"shimogo.fukushima.jp":true,"shirakawa.fukushima.jp":true,"showa.fukushima.jp":true,"soma.fukushima.jp":true,"sukagawa.fukushima.jp":true,"taishin.fukushima.jp":true,"tamakawa.fukushima.jp":true,"tanagura.fukushima.jp":true,"tenei.fukushima.jp":true,"yabuki.fukushima.jp":true,"yamato.fukushima.jp":true,"yamatsuri.fukushima.jp":true,"yanaizu.fukushima.jp":true,"yugawa.fukushima.jp":true,"anpachi.gifu.jp":true,"ena.gifu.jp":true,"gifu.gifu.jp":true,"ginan.gifu.jp":true,"godo.gifu.jp":true,"gujo.gifu.jp":true,"hashima.gifu.jp":true,"hichiso.gifu.jp":true,"hida.gifu.jp":true,"higashishirakawa.gifu.jp":true,"ibigawa.gifu.jp":true,"ikeda.gifu.jp":true,"kakamigahara.gifu.jp":true,"kani.gifu.jp":true,"kasahara.gifu.jp":true,"kasamatsu.gifu.jp":true,"kawaue.gifu.jp":true,"kitagata.gifu.jp":true,"mino.gifu.jp":true,"minokamo.gifu.jp":true,"mitake.gifu.jp":true,"mizunami.gifu.jp":true,"motosu.gifu.jp":true,"nakatsugawa.gifu.jp":true,"ogaki.gifu.jp":true,"sakahogi.gifu.jp":true,"seki.gifu.jp":true,"sekigahara.gifu.jp":true,"shirakawa.gifu.jp":true,"tajimi.gifu.jp":true,"takayama.gifu.jp":true,"tarui.gifu.jp":true,"toki.gifu.jp":true,"tomika.gifu.jp":true,"wanouchi.gifu.jp":true,"yamagata.gifu.jp":true,"yaotsu.gifu.jp":true,"yoro.gifu.jp":true,"annaka.gunma.jp":true,"chiyoda.gunma.jp":true,"fujioka.gunma.jp":true,"higashiagatsuma.gunma.jp":true,"isesaki.gunma.jp":true,"itakura.gunma.jp":true,"kanna.gunma.jp":true,"kanra.gunma.jp":true,"katashina.gunma.jp":true,"kawaba.gunma.jp":true,"kiryu.gunma.jp":true,"kusatsu.gunma.jp":true,"maebashi.gunma.jp":true,"meiwa.gunma.jp":true,"midori.gunma.jp":true,"minakami.gunma.jp":true,"naganohara.gunma.jp":true,"nakanojo.gunma.jp":true,"nanmoku.gunma.jp":true,"numata.gunma.jp":true,"oizumi.gunma.jp":true,"ora.gunma.jp":true,"ota.gunma.jp":true,"shibukawa.gunma.jp":true,"shimonita.gunma.jp":true,"shinto.gunma.jp":true,"showa.gunma.jp":true,"takasaki.gunma.jp":true,"takayama.gunma.jp":true,"tamamura.gunma.jp":true,"tatebayashi.gunma.jp":true,"tomioka.gunma.jp":true,"tsukiyono.gunma.jp":true,"tsumagoi.gunma.jp":true,"ueno.gunma.jp":true,"yoshioka.gunma.jp":true,"asaminami.hiroshima.jp":true,"daiwa.hiroshima.jp":true,"etajima.hiroshima.jp":true,"fuchu.hiroshima.jp":true,"fukuyama.hiroshima.jp":true,"hatsukaichi.hiroshima.jp":true,"higashihiroshima.hiroshima.jp":true,"hongo.hiroshima.jp":true,"jinsekikogen.hiroshima.jp":true,"kaita.hiroshima.jp":true,"kui.hiroshima.jp":true,"kumano.hiroshima.jp":true,"kure.hiroshima.jp":true,"mihara.hiroshima.jp":true,"miyoshi.hiroshima.jp":true,"naka.hiroshima.jp":true,"onomichi.hiroshima.jp":true,"osakikamijima.hiroshima.jp":true,"otake.hiroshima.jp":true,"saka.hiroshima.jp":true,"sera.hiroshima.jp":true,"seranishi.hiroshima.jp":true,"shinichi.hiroshima.jp":true,"shobara.hiroshima.jp":true,"takehara.hiroshima.jp":true,"abashiri.hokkaido.jp":true,"abira.hokkaido.jp":true,"aibetsu.hokkaido.jp":true,"akabira.hokkaido.jp":true,"akkeshi.hokkaido.jp":true,"asahikawa.hokkaido.jp":true,"ashibetsu.hokkaido.jp":true,"ashoro.hokkaido.jp":true,"assabu.hokkaido.jp":true,"atsuma.hokkaido.jp":true,"bibai.hokkaido.jp":true,"biei.hokkaido.jp":true,"bifuka.hokkaido.jp":true,"bihoro.hokkaido.jp":true,"biratori.hokkaido.jp":true,"chippubetsu.hokkaido.jp":true,"chitose.hokkaido.jp":true,"date.hokkaido.jp":true,"ebetsu.hokkaido.jp":true,"embetsu.hokkaido.jp":true,"eniwa.hokkaido.jp":true,"erimo.hokkaido.jp":true,"esan.hokkaido.jp":true,"esashi.hokkaido.jp":true,"fukagawa.hokkaido.jp":true,"fukushima.hokkaido.jp":true,"furano.hokkaido.jp":true,"furubira.hokkaido.jp":true,"haboro.hokkaido.jp":true,"hakodate.hokkaido.jp":true,"hamatonbetsu.hokkaido.jp":true,"hidaka.hokkaido.jp":true,"higashikagura.hokkaido.jp":true,"higashikawa.hokkaido.jp":true,"hiroo.hokkaido.jp":true,"hokuryu.hokkaido.jp":true,"hokuto.hokkaido.jp":true,"honbetsu.hokkaido.jp":true,"horokanai.hokkaido.jp":true,"horonobe.hokkaido.jp":true,"ikeda.hokkaido.jp":true,"imakane.hokkaido.jp":true,"ishikari.hokkaido.jp":true,"iwamizawa.hokkaido.jp":true,"iwanai.hokkaido.jp":true,"kamifurano.hokkaido.jp":true,"kamikawa.hokkaido.jp":true,"kamishihoro.hokkaido.jp":true,"kamisunagawa.hokkaido.jp":true,"kamoenai.hokkaido.jp":true,"kayabe.hokkaido.jp":true,"kembuchi.hokkaido.jp":true,"kikonai.hokkaido.jp":true,"kimobetsu.hokkaido.jp":true,"kitahiroshima.hokkaido.jp":true,"kitami.hokkaido.jp":true,"kiyosato.hokkaido.jp":true,"koshimizu.hokkaido.jp":true,"kunneppu.hokkaido.jp":true,"kuriyama.hokkaido.jp":true,"kuromatsunai.hokkaido.jp":true,"kushiro.hokkaido.jp":true,"kutchan.hokkaido.jp":true,"kyowa.hokkaido.jp":true,"mashike.hokkaido.jp":true,"matsumae.hokkaido.jp":true,"mikasa.hokkaido.jp":true,"minamifurano.hokkaido.jp":true,"mombetsu.hokkaido.jp":true,"moseushi.hokkaido.jp":true,"mukawa.hokkaido.jp":true,"muroran.hokkaido.jp":true,"naie.hokkaido.jp":true,"nakagawa.hokkaido.jp":true,"nakasatsunai.hokkaido.jp":true,"nakatombetsu.hokkaido.jp":true,"nanae.hokkaido.jp":true,"nanporo.hokkaido.jp":true,"nayoro.hokkaido.jp":true,"nemuro.hokkaido.jp":true,"niikappu.hokkaido.jp":true,"niki.hokkaido.jp":true,"nishiokoppe.hokkaido.jp":true,"noboribetsu.hokkaido.jp":true,"numata.hokkaido.jp":true,"obihiro.hokkaido.jp":true,"obira.hokkaido.jp":true,"oketo.hokkaido.jp":true,"okoppe.hokkaido.jp":true,"otaru.hokkaido.jp":true,"otobe.hokkaido.jp":true,"otofuke.hokkaido.jp":true,"otoineppu.hokkaido.jp":true,"oumu.hokkaido.jp":true,"ozora.hokkaido.jp":true,"pippu.hokkaido.jp":true,"rankoshi.hokkaido.jp":true,"rebun.hokkaido.jp":true,"rikubetsu.hokkaido.jp":true,"rishiri.hokkaido.jp":true,"rishirifuji.hokkaido.jp":true,"saroma.hokkaido.jp":true,"sarufutsu.hokkaido.jp":true,"shakotan.hokkaido.jp":true,"shari.hokkaido.jp":true,"shibecha.hokkaido.jp":true,"shibetsu.hokkaido.jp":true,"shikabe.hokkaido.jp":true,"shikaoi.hokkaido.jp":true,"shimamaki.hokkaido.jp":true,"shimizu.hokkaido.jp":true,"shimokawa.hokkaido.jp":true,"shinshinotsu.hokkaido.jp":true,"shintoku.hokkaido.jp":true,"shiranuka.hokkaido.jp":true,"shiraoi.hokkaido.jp":true,"shiriuchi.hokkaido.jp":true,"sobetsu.hokkaido.jp":true,"sunagawa.hokkaido.jp":true,"taiki.hokkaido.jp":true,"takasu.hokkaido.jp":true,"takikawa.hokkaido.jp":true,"takinoue.hokkaido.jp":true,"teshikaga.hokkaido.jp":true,"tobetsu.hokkaido.jp":true,"tohma.hokkaido.jp":true,"tomakomai.hokkaido.jp":true,"tomari.hokkaido.jp":true,"toya.hokkaido.jp":true,"toyako.hokkaido.jp":true,"toyotomi.hokkaido.jp":true,"toyoura.hokkaido.jp":true,"tsubetsu.hokkaido.jp":true,"tsukigata.hokkaido.jp":true,"urakawa.hokkaido.jp":true,"urausu.hokkaido.jp":true,"uryu.hokkaido.jp":true,"utashinai.hokkaido.jp":true,"wakkanai.hokkaido.jp":true,"wassamu.hokkaido.jp":true,"yakumo.hokkaido.jp":true,"yoichi.hokkaido.jp":true,"aioi.hyogo.jp":true,"akashi.hyogo.jp":true,"ako.hyogo.jp":true,"amagasaki.hyogo.jp":true,"aogaki.hyogo.jp":true,"asago.hyogo.jp":true,"ashiya.hyogo.jp":true,"awaji.hyogo.jp":true,"fukusaki.hyogo.jp":true,"goshiki.hyogo.jp":true,"harima.hyogo.jp":true,"himeji.hyogo.jp":true,"ichikawa.hyogo.jp":true,"inagawa.hyogo.jp":true,"itami.hyogo.jp":true,"kakogawa.hyogo.jp":true,"kamigori.hyogo.jp":true,"kamikawa.hyogo.jp":true,"kasai.hyogo.jp":true,"kasuga.hyogo.jp":true,"kawanishi.hyogo.jp":true,"miki.hyogo.jp":true,"minamiawaji.hyogo.jp":true,"nishinomiya.hyogo.jp":true,"nishiwaki.hyogo.jp":true,"ono.hyogo.jp":true,"sanda.hyogo.jp":true,"sannan.hyogo.jp":true,"sasayama.hyogo.jp":true,"sayo.hyogo.jp":true,"shingu.hyogo.jp":true,"shinonsen.hyogo.jp":true,"shiso.hyogo.jp":true,"sumoto.hyogo.jp":true,"taishi.hyogo.jp":true,"taka.hyogo.jp":true,"takarazuka.hyogo.jp":true,"takasago.hyogo.jp":true,"takino.hyogo.jp":true,"tamba.hyogo.jp":true,"tatsuno.hyogo.jp":true,"toyooka.hyogo.jp":true,"yabu.hyogo.jp":true,"yashiro.hyogo.jp":true,"yoka.hyogo.jp":true,"yokawa.hyogo.jp":true,"ami.ibaraki.jp":true,"asahi.ibaraki.jp":true,"bando.ibaraki.jp":true,"chikusei.ibaraki.jp":true,"daigo.ibaraki.jp":true,"fujishiro.ibaraki.jp":true,"hitachi.ibaraki.jp":true,"hitachinaka.ibaraki.jp":true,"hitachiomiya.ibaraki.jp":true,"hitachiota.ibaraki.jp":true,"ibaraki.ibaraki.jp":true,"ina.ibaraki.jp":true,"inashiki.ibaraki.jp":true,"itako.ibaraki.jp":true,"iwama.ibaraki.jp":true,"joso.ibaraki.jp":true,"kamisu.ibaraki.jp":true,"kasama.ibaraki.jp":true,"kashima.ibaraki.jp":true,"kasumigaura.ibaraki.jp":true,"koga.ibaraki.jp":true,"miho.ibaraki.jp":true,"mito.ibaraki.jp":true,"moriya.ibaraki.jp":true,"naka.ibaraki.jp":true,"namegata.ibaraki.jp":true,"oarai.ibaraki.jp":true,"ogawa.ibaraki.jp":true,"omitama.ibaraki.jp":true,"ryugasaki.ibaraki.jp":true,"sakai.ibaraki.jp":true,"sakuragawa.ibaraki.jp":true,"shimodate.ibaraki.jp":true,"shimotsuma.ibaraki.jp":true,"shirosato.ibaraki.jp":true,"sowa.ibaraki.jp":true,"suifu.ibaraki.jp":true,"takahagi.ibaraki.jp":true,"tamatsukuri.ibaraki.jp":true,"tokai.ibaraki.jp":true,"tomobe.ibaraki.jp":true,"tone.ibaraki.jp":true,"toride.ibaraki.jp":true,"tsuchiura.ibaraki.jp":true,"tsukuba.ibaraki.jp":true,"uchihara.ibaraki.jp":true,"ushiku.ibaraki.jp":true,"yachiyo.ibaraki.jp":true,"yamagata.ibaraki.jp":true,"yawara.ibaraki.jp":true,"yuki.ibaraki.jp":true,"anamizu.ishikawa.jp":true,"hakui.ishikawa.jp":true,"hakusan.ishikawa.jp":true,"kaga.ishikawa.jp":true,"kahoku.ishikawa.jp":true,"kanazawa.ishikawa.jp":true,"kawakita.ishikawa.jp":true,"komatsu.ishikawa.jp":true,"nakanoto.ishikawa.jp":true,"nanao.ishikawa.jp":true,"nomi.ishikawa.jp":true,"nonoichi.ishikawa.jp":true,"noto.ishikawa.jp":true,"shika.ishikawa.jp":true,"suzu.ishikawa.jp":true,"tsubata.ishikawa.jp":true,"tsurugi.ishikawa.jp":true,"uchinada.ishikawa.jp":true,"wajima.ishikawa.jp":true,"fudai.iwate.jp":true,"fujisawa.iwate.jp":true,"hanamaki.iwate.jp":true,"hiraizumi.iwate.jp":true,"hirono.iwate.jp":true,"ichinohe.iwate.jp":true,"ichinoseki.iwate.jp":true,"iwaizumi.iwate.jp":true,"iwate.iwate.jp":true,"joboji.iwate.jp":true,"kamaishi.iwate.jp":true,"kanegasaki.iwate.jp":true,"karumai.iwate.jp":true,"kawai.iwate.jp":true,"kitakami.iwate.jp":true,"kuji.iwate.jp":true,"kunohe.iwate.jp":true,"kuzumaki.iwate.jp":true,"miyako.iwate.jp":true,"mizusawa.iwate.jp":true,"morioka.iwate.jp":true,"ninohe.iwate.jp":true,"noda.iwate.jp":true,"ofunato.iwate.jp":true,"oshu.iwate.jp":true,"otsuchi.iwate.jp":true,"rikuzentakata.iwate.jp":true,"shiwa.iwate.jp":true,"shizukuishi.iwate.jp":true,"sumita.iwate.jp":true,"tanohata.iwate.jp":true,"tono.iwate.jp":true,"yahaba.iwate.jp":true,"yamada.iwate.jp":true,"ayagawa.kagawa.jp":true,"higashikagawa.kagawa.jp":true,"kanonji.kagawa.jp":true,"kotohira.kagawa.jp":true,"manno.kagawa.jp":true,"marugame.kagawa.jp":true,"mitoyo.kagawa.jp":true,"naoshima.kagawa.jp":true,"sanuki.kagawa.jp":true,"tadotsu.kagawa.jp":true,"takamatsu.kagawa.jp":true,"tonosho.kagawa.jp":true,"uchinomi.kagawa.jp":true,"utazu.kagawa.jp":true,"zentsuji.kagawa.jp":true,"akune.kagoshima.jp":true,"amami.kagoshima.jp":true,"hioki.kagoshima.jp":true,"isa.kagoshima.jp":true,"isen.kagoshima.jp":true,"izumi.kagoshima.jp":true,"kagoshima.kagoshima.jp":true,"kanoya.kagoshima.jp":true,"kawanabe.kagoshima.jp":true,"kinko.kagoshima.jp":true,"kouyama.kagoshima.jp":true,"makurazaki.kagoshima.jp":true,"matsumoto.kagoshima.jp":true,"minamitane.kagoshima.jp":true,"nakatane.kagoshima.jp":true,"nishinoomote.kagoshima.jp":true,"satsumasendai.kagoshima.jp":true,"soo.kagoshima.jp":true,"tarumizu.kagoshima.jp":true,"yusui.kagoshima.jp":true,"aikawa.kanagawa.jp":true,"atsugi.kanagawa.jp":true,"ayase.kanagawa.jp":true,"chigasaki.kanagawa.jp":true,"ebina.kanagawa.jp":true,"fujisawa.kanagawa.jp":true,"hadano.kanagawa.jp":true,"hakone.kanagawa.jp":true,"hiratsuka.kanagawa.jp":true,"isehara.kanagawa.jp":true,"kaisei.kanagawa.jp":true,"kamakura.kanagawa.jp":true,"kiyokawa.kanagawa.jp":true,"matsuda.kanagawa.jp":true,"minamiashigara.kanagawa.jp":true,"miura.kanagawa.jp":true,"nakai.kanagawa.jp":true,"ninomiya.kanagawa.jp":true,"odawara.kanagawa.jp":true,"oi.kanagawa.jp":true,"oiso.kanagawa.jp":true,"sagamihara.kanagawa.jp":true,"samukawa.kanagawa.jp":true,"tsukui.kanagawa.jp":true,"yamakita.kanagawa.jp":true,"yamato.kanagawa.jp":true,"yokosuka.kanagawa.jp":true,"yugawara.kanagawa.jp":true,"zama.kanagawa.jp":true,"zushi.kanagawa.jp":true,"aki.kochi.jp":true,"geisei.kochi.jp":true,"hidaka.kochi.jp":true,"higashitsuno.kochi.jp":true,"ino.kochi.jp":true,"kagami.kochi.jp":true,"kami.kochi.jp":true,"kitagawa.kochi.jp":true,"kochi.kochi.jp":true,"mihara.kochi.jp":true,"motoyama.kochi.jp":true,"muroto.kochi.jp":true,"nahari.kochi.jp":true,"nakamura.kochi.jp":true,"nankoku.kochi.jp":true,"nishitosa.kochi.jp":true,"niyodogawa.kochi.jp":true,"ochi.kochi.jp":true,"okawa.kochi.jp":true,"otoyo.kochi.jp":true,"otsuki.kochi.jp":true,"sakawa.kochi.jp":true,"sukumo.kochi.jp":true,"susaki.kochi.jp":true,"tosa.kochi.jp":true,"tosashimizu.kochi.jp":true,"toyo.kochi.jp":true,"tsuno.kochi.jp":true,"umaji.kochi.jp":true,"yasuda.kochi.jp":true,"yusuhara.kochi.jp":true,"amakusa.kumamoto.jp":true,"arao.kumamoto.jp":true,"aso.kumamoto.jp":true,"choyo.kumamoto.jp":true,"gyokuto.kumamoto.jp":true,"kamiamakusa.kumamoto.jp":true,"kikuchi.kumamoto.jp":true,"kumamoto.kumamoto.jp":true,"mashiki.kumamoto.jp":true,"mifune.kumamoto.jp":true,"minamata.kumamoto.jp":true,"minamioguni.kumamoto.jp":true,"nagasu.kumamoto.jp":true,"nishihara.kumamoto.jp":true,"oguni.kumamoto.jp":true,"ozu.kumamoto.jp":true,"sumoto.kumamoto.jp":true,"takamori.kumamoto.jp":true,"uki.kumamoto.jp":true,"uto.kumamoto.jp":true,"yamaga.kumamoto.jp":true,"yamato.kumamoto.jp":true,"yatsushiro.kumamoto.jp":true,"ayabe.kyoto.jp":true,"fukuchiyama.kyoto.jp":true,"higashiyama.kyoto.jp":true,"ide.kyoto.jp":true,"ine.kyoto.jp":true,"joyo.kyoto.jp":true,"kameoka.kyoto.jp":true,"kamo.kyoto.jp":true,"kita.kyoto.jp":true,"kizu.kyoto.jp":true,"kumiyama.kyoto.jp":true,"kyotamba.kyoto.jp":true,"kyotanabe.kyoto.jp":true,"kyotango.kyoto.jp":true,"maizuru.kyoto.jp":true,"minami.kyoto.jp":true,"minamiyamashiro.kyoto.jp":true,"miyazu.kyoto.jp":true,"muko.kyoto.jp":true,"nagaokakyo.kyoto.jp":true,"nakagyo.kyoto.jp":true,"nantan.kyoto.jp":true,"oyamazaki.kyoto.jp":true,"sakyo.kyoto.jp":true,"seika.kyoto.jp":true,"tanabe.kyoto.jp":true,"uji.kyoto.jp":true,"ujitawara.kyoto.jp":true,"wazuka.kyoto.jp":true,"yamashina.kyoto.jp":true,"yawata.kyoto.jp":true,"asahi.mie.jp":true,"inabe.mie.jp":true,"ise.mie.jp":true,"kameyama.mie.jp":true,"kawagoe.mie.jp":true,"kiho.mie.jp":true,"kisosaki.mie.jp":true,"kiwa.mie.jp":true,"komono.mie.jp":true,"kumano.mie.jp":true,"kuwana.mie.jp":true,"matsusaka.mie.jp":true,"meiwa.mie.jp":true,"mihama.mie.jp":true,"minamiise.mie.jp":true,"misugi.mie.jp":true,"miyama.mie.jp":true,"nabari.mie.jp":true,"shima.mie.jp":true,"suzuka.mie.jp":true,"tado.mie.jp":true,"taiki.mie.jp":true,"taki.mie.jp":true,"tamaki.mie.jp":true,"toba.mie.jp":true,"tsu.mie.jp":true,"udono.mie.jp":true,"ureshino.mie.jp":true,"watarai.mie.jp":true,"yokkaichi.mie.jp":true,"furukawa.miyagi.jp":true,"higashimatsushima.miyagi.jp":true,"ishinomaki.miyagi.jp":true,"iwanuma.miyagi.jp":true,"kakuda.miyagi.jp":true,"kami.miyagi.jp":true,"kawasaki.miyagi.jp":true,"marumori.miyagi.jp":true,"matsushima.miyagi.jp":true,"minamisanriku.miyagi.jp":true,"misato.miyagi.jp":true,"murata.miyagi.jp":true,"natori.miyagi.jp":true,"ogawara.miyagi.jp":true,"ohira.miyagi.jp":true,"onagawa.miyagi.jp":true,"osaki.miyagi.jp":true,"rifu.miyagi.jp":true,"semine.miyagi.jp":true,"shibata.miyagi.jp":true,"shichikashuku.miyagi.jp":true,"shikama.miyagi.jp":true,"shiogama.miyagi.jp":true,"shiroishi.miyagi.jp":true,"tagajo.miyagi.jp":true,"taiwa.miyagi.jp":true,"tome.miyagi.jp":true,"tomiya.miyagi.jp":true,"wakuya.miyagi.jp":true,"watari.miyagi.jp":true,"yamamoto.miyagi.jp":true,"zao.miyagi.jp":true,"aya.miyazaki.jp":true,"ebino.miyazaki.jp":true,"gokase.miyazaki.jp":true,"hyuga.miyazaki.jp":true,"kadogawa.miyazaki.jp":true,"kawaminami.miyazaki.jp":true,"kijo.miyazaki.jp":true,"kitagawa.miyazaki.jp":true,"kitakata.miyazaki.jp":true,"kitaura.miyazaki.jp":true,"kobayashi.miyazaki.jp":true,"kunitomi.miyazaki.jp":true,"kushima.miyazaki.jp":true,"mimata.miyazaki.jp":true,"miyakonojo.miyazaki.jp":true,"miyazaki.miyazaki.jp":true,"morotsuka.miyazaki.jp":true,"nichinan.miyazaki.jp":true,"nishimera.miyazaki.jp":true,"nobeoka.miyazaki.jp":true,"saito.miyazaki.jp":true,"shiiba.miyazaki.jp":true,"shintomi.miyazaki.jp":true,"takaharu.miyazaki.jp":true,"takanabe.miyazaki.jp":true,"takazaki.miyazaki.jp":true,"tsuno.miyazaki.jp":true,"achi.nagano.jp":true,"agematsu.nagano.jp":true,"anan.nagano.jp":true,"aoki.nagano.jp":true,"asahi.nagano.jp":true,"azumino.nagano.jp":true,"chikuhoku.nagano.jp":true,"chikuma.nagano.jp":true,"chino.nagano.jp":true,"fujimi.nagano.jp":true,"hakuba.nagano.jp":true,"hara.nagano.jp":true,"hiraya.nagano.jp":true,"iida.nagano.jp":true,"iijima.nagano.jp":true,"iiyama.nagano.jp":true,"iizuna.nagano.jp":true,"ikeda.nagano.jp":true,"ikusaka.nagano.jp":true,"ina.nagano.jp":true,"karuizawa.nagano.jp":true,"kawakami.nagano.jp":true,"kiso.nagano.jp":true,"kisofukushima.nagano.jp":true,"kitaaiki.nagano.jp":true,"komagane.nagano.jp":true,"komoro.nagano.jp":true,"matsukawa.nagano.jp":true,"matsumoto.nagano.jp":true,"miasa.nagano.jp":true,"minamiaiki.nagano.jp":true,"minamimaki.nagano.jp":true,"minamiminowa.nagano.jp":true,"minowa.nagano.jp":true,"miyada.nagano.jp":true,"miyota.nagano.jp":true,"mochizuki.nagano.jp":true,"nagano.nagano.jp":true,"nagawa.nagano.jp":true,"nagiso.nagano.jp":true,"nakagawa.nagano.jp":true,"nakano.nagano.jp":true,"nozawaonsen.nagano.jp":true,"obuse.nagano.jp":true,"ogawa.nagano.jp":true,"okaya.nagano.jp":true,"omachi.nagano.jp":true,"omi.nagano.jp":true,"ookuwa.nagano.jp":true,"ooshika.nagano.jp":true,"otaki.nagano.jp":true,"otari.nagano.jp":true,"sakae.nagano.jp":true,"sakaki.nagano.jp":true,"saku.nagano.jp":true,"sakuho.nagano.jp":true,"shimosuwa.nagano.jp":true,"shinanomachi.nagano.jp":true,"shiojiri.nagano.jp":true,"suwa.nagano.jp":true,"suzaka.nagano.jp":true,"takagi.nagano.jp":true,"takamori.nagano.jp":true,"takayama.nagano.jp":true,"tateshina.nagano.jp":true,"tatsuno.nagano.jp":true,"togakushi.nagano.jp":true,"togura.nagano.jp":true,"tomi.nagano.jp":true,"ueda.nagano.jp":true,"wada.nagano.jp":true,"yamagata.nagano.jp":true,"yamanouchi.nagano.jp":true,"yasaka.nagano.jp":true,"yasuoka.nagano.jp":true,"chijiwa.nagasaki.jp":true,"futsu.nagasaki.jp":true,"goto.nagasaki.jp":true,"hasami.nagasaki.jp":true,"hirado.nagasaki.jp":true,"iki.nagasaki.jp":true,"isahaya.nagasaki.jp":true,"kawatana.nagasaki.jp":true,"kuchinotsu.nagasaki.jp":true,"matsuura.nagasaki.jp":true,"nagasaki.nagasaki.jp":true,"obama.nagasaki.jp":true,"omura.nagasaki.jp":true,"oseto.nagasaki.jp":true,"saikai.nagasaki.jp":true,"sasebo.nagasaki.jp":true,"seihi.nagasaki.jp":true,"shimabara.nagasaki.jp":true,"shinkamigoto.nagasaki.jp":true,"togitsu.nagasaki.jp":true,"tsushima.nagasaki.jp":true,"unzen.nagasaki.jp":true,"ando.nara.jp":true,"gose.nara.jp":true,"heguri.nara.jp":true,"higashiyoshino.nara.jp":true,"ikaruga.nara.jp":true,"ikoma.nara.jp":true,"kamikitayama.nara.jp":true,"kanmaki.nara.jp":true,"kashiba.nara.jp":true,"kashihara.nara.jp":true,"katsuragi.nara.jp":true,"kawai.nara.jp":true,"kawakami.nara.jp":true,"kawanishi.nara.jp":true,"koryo.nara.jp":true,"kurotaki.nara.jp":true,"mitsue.nara.jp":true,"miyake.nara.jp":true,"nara.nara.jp":true,"nosegawa.nara.jp":true,"oji.nara.jp":true,"ouda.nara.jp":true,"oyodo.nara.jp":true,"sakurai.nara.jp":true,"sango.nara.jp":true,"shimoichi.nara.jp":true,"shimokitayama.nara.jp":true,"shinjo.nara.jp":true,"soni.nara.jp":true,"takatori.nara.jp":true,"tawaramoto.nara.jp":true,"tenkawa.nara.jp":true,"tenri.nara.jp":true,"uda.nara.jp":true,"yamatokoriyama.nara.jp":true,"yamatotakada.nara.jp":true,"yamazoe.nara.jp":true,"yoshino.nara.jp":true,"aga.niigata.jp":true,"agano.niigata.jp":true,"gosen.niigata.jp":true,"itoigawa.niigata.jp":true,"izumozaki.niigata.jp":true,"joetsu.niigata.jp":true,"kamo.niigata.jp":true,"kariwa.niigata.jp":true,"kashiwazaki.niigata.jp":true,"minamiuonuma.niigata.jp":true,"mitsuke.niigata.jp":true,"muika.niigata.jp":true,"murakami.niigata.jp":true,"myoko.niigata.jp":true,"nagaoka.niigata.jp":true,"niigata.niigata.jp":true,"ojiya.niigata.jp":true,"omi.niigata.jp":true,"sado.niigata.jp":true,"sanjo.niigata.jp":true,"seiro.niigata.jp":true,"seirou.niigata.jp":true,"sekikawa.niigata.jp":true,"shibata.niigata.jp":true,"tagami.niigata.jp":true,"tainai.niigata.jp":true,"tochio.niigata.jp":true,"tokamachi.niigata.jp":true,"tsubame.niigata.jp":true,"tsunan.niigata.jp":true,"uonuma.niigata.jp":true,"yahiko.niigata.jp":true,"yoita.niigata.jp":true,"yuzawa.niigata.jp":true,"beppu.oita.jp":true,"bungoono.oita.jp":true,"bungotakada.oita.jp":true,"hasama.oita.jp":true,"hiji.oita.jp":true,"himeshima.oita.jp":true,"hita.oita.jp":true,"kamitsue.oita.jp":true,"kokonoe.oita.jp":true,"kuju.oita.jp":true,"kunisaki.oita.jp":true,"kusu.oita.jp":true,"oita.oita.jp":true,"saiki.oita.jp":true,"taketa.oita.jp":true,"tsukumi.oita.jp":true,"usa.oita.jp":true,"usuki.oita.jp":true,"yufu.oita.jp":true,"akaiwa.okayama.jp":true,"asakuchi.okayama.jp":true,"bizen.okayama.jp":true,"hayashima.okayama.jp":true,"ibara.okayama.jp":true,"kagamino.okayama.jp":true,"kasaoka.okayama.jp":true,"kibichuo.okayama.jp":true,"kumenan.okayama.jp":true,"kurashiki.okayama.jp":true,"maniwa.okayama.jp":true,"misaki.okayama.jp":true,"nagi.okayama.jp":true,"niimi.okayama.jp":true,"nishiawakura.okayama.jp":true,"okayama.okayama.jp":true,"satosho.okayama.jp":true,"setouchi.okayama.jp":true,"shinjo.okayama.jp":true,"shoo.okayama.jp":true,"soja.okayama.jp":true,"takahashi.okayama.jp":true,"tamano.okayama.jp":true,"tsuyama.okayama.jp":true,"wake.okayama.jp":true,"yakage.okayama.jp":true,"aguni.okinawa.jp":true,"ginowan.okinawa.jp":true,"ginoza.okinawa.jp":true,"gushikami.okinawa.jp":true,"haebaru.okinawa.jp":true,"higashi.okinawa.jp":true,"hirara.okinawa.jp":true,"iheya.okinawa.jp":true,"ishigaki.okinawa.jp":true,"ishikawa.okinawa.jp":true,"itoman.okinawa.jp":true,"izena.okinawa.jp":true,"kadena.okinawa.jp":true,"kin.okinawa.jp":true,"kitadaito.okinawa.jp":true,"kitanakagusuku.okinawa.jp":true,"kumejima.okinawa.jp":true,"kunigami.okinawa.jp":true,"minamidaito.okinawa.jp":true,"motobu.okinawa.jp":true,"nago.okinawa.jp":true,"naha.okinawa.jp":true,"nakagusuku.okinawa.jp":true,"nakijin.okinawa.jp":true,"nanjo.okinawa.jp":true,"nishihara.okinawa.jp":true,"ogimi.okinawa.jp":true,"okinawa.okinawa.jp":true,"onna.okinawa.jp":true,"shimoji.okinawa.jp":true,"taketomi.okinawa.jp":true,"tarama.okinawa.jp":true,"tokashiki.okinawa.jp":true,"tomigusuku.okinawa.jp":true,"tonaki.okinawa.jp":true,"urasoe.okinawa.jp":true,"uruma.okinawa.jp":true,"yaese.okinawa.jp":true,"yomitan.okinawa.jp":true,"yonabaru.okinawa.jp":true,"yonaguni.okinawa.jp":true,"zamami.okinawa.jp":true,"abeno.osaka.jp":true,"chihayaakasaka.osaka.jp":true,"chuo.osaka.jp":true,"daito.osaka.jp":true,"fujiidera.osaka.jp":true,"habikino.osaka.jp":true,"hannan.osaka.jp":true,"higashiosaka.osaka.jp":true,"higashisumiyoshi.osaka.jp":true,"higashiyodogawa.osaka.jp":true,"hirakata.osaka.jp":true,"ibaraki.osaka.jp":true,"ikeda.osaka.jp":true,"izumi.osaka.jp":true,"izumiotsu.osaka.jp":true,"izumisano.osaka.jp":true,"kadoma.osaka.jp":true,"kaizuka.osaka.jp":true,"kanan.osaka.jp":true,"kashiwara.osaka.jp":true,"katano.osaka.jp":true,"kawachinagano.osaka.jp":true,"kishiwada.osaka.jp":true,"kita.osaka.jp":true,"kumatori.osaka.jp":true,"matsubara.osaka.jp":true,"minato.osaka.jp":true,"minoh.osaka.jp":true,"misaki.osaka.jp":true,"moriguchi.osaka.jp":true,"neyagawa.osaka.jp":true,"nishi.osaka.jp":true,"nose.osaka.jp":true,"osakasayama.osaka.jp":true,"sakai.osaka.jp":true,"sayama.osaka.jp":true,"sennan.osaka.jp":true,"settsu.osaka.jp":true,"shijonawate.osaka.jp":true,"shimamoto.osaka.jp":true,"suita.osaka.jp":true,"tadaoka.osaka.jp":true,"taishi.osaka.jp":true,"tajiri.osaka.jp":true,"takaishi.osaka.jp":true,"takatsuki.osaka.jp":true,"tondabayashi.osaka.jp":true,"toyonaka.osaka.jp":true,"toyono.osaka.jp":true,"yao.osaka.jp":true,"ariake.saga.jp":true,"arita.saga.jp":true,"fukudomi.saga.jp":true,"genkai.saga.jp":true,"hamatama.saga.jp":true,"hizen.saga.jp":true,"imari.saga.jp":true,"kamimine.saga.jp":true,"kanzaki.saga.jp":true,"karatsu.saga.jp":true,"kashima.saga.jp":true,"kitagata.saga.jp":true,"kitahata.saga.jp":true,"kiyama.saga.jp":true,"kouhoku.saga.jp":true,"kyuragi.saga.jp":true,"nishiarita.saga.jp":true,"ogi.saga.jp":true,"omachi.saga.jp":true,"ouchi.saga.jp":true,"saga.saga.jp":true,"shiroishi.saga.jp":true,"taku.saga.jp":true,"tara.saga.jp":true,"tosu.saga.jp":true,"yoshinogari.saga.jp":true,"arakawa.saitama.jp":true,"asaka.saitama.jp":true,"chichibu.saitama.jp":true,"fujimi.saitama.jp":true,"fujimino.saitama.jp":true,"fukaya.saitama.jp":true,"hanno.saitama.jp":true,"hanyu.saitama.jp":true,"hasuda.saitama.jp":true,"hatogaya.saitama.jp":true,"hatoyama.saitama.jp":true,"hidaka.saitama.jp":true,"higashichichibu.saitama.jp":true,"higashimatsuyama.saitama.jp":true,"honjo.saitama.jp":true,"ina.saitama.jp":true,"iruma.saitama.jp":true,"iwatsuki.saitama.jp":true,"kamiizumi.saitama.jp":true,"kamikawa.saitama.jp":true,"kamisato.saitama.jp":true,"kasukabe.saitama.jp":true,"kawagoe.saitama.jp":true,"kawaguchi.saitama.jp":true,"kawajima.saitama.jp":true,"kazo.saitama.jp":true,"kitamoto.saitama.jp":true,"koshigaya.saitama.jp":true,"kounosu.saitama.jp":true,"kuki.saitama.jp":true,"kumagaya.saitama.jp":true,"matsubushi.saitama.jp":true,"minano.saitama.jp":true,"misato.saitama.jp":true,"miyashiro.saitama.jp":true,"miyoshi.saitama.jp":true,"moroyama.saitama.jp":true,"nagatoro.saitama.jp":true,"namegawa.saitama.jp":true,"niiza.saitama.jp":true,"ogano.saitama.jp":true,"ogawa.saitama.jp":true,"ogose.saitama.jp":true,"okegawa.saitama.jp":true,"omiya.saitama.jp":true,"otaki.saitama.jp":true,"ranzan.saitama.jp":true,"ryokami.saitama.jp":true,"saitama.saitama.jp":true,"sakado.saitama.jp":true,"satte.saitama.jp":true,"sayama.saitama.jp":true,"shiki.saitama.jp":true,"shiraoka.saitama.jp":true,"soka.saitama.jp":true,"sugito.saitama.jp":true,"toda.saitama.jp":true,"tokigawa.saitama.jp":true,"tokorozawa.saitama.jp":true,"tsurugashima.saitama.jp":true,"urawa.saitama.jp":true,"warabi.saitama.jp":true,"yashio.saitama.jp":true,"yokoze.saitama.jp":true,"yono.saitama.jp":true,"yorii.saitama.jp":true,"yoshida.saitama.jp":true,"yoshikawa.saitama.jp":true,"yoshimi.saitama.jp":true,"aisho.shiga.jp":true,"gamo.shiga.jp":true,"higashiomi.shiga.jp":true,"hikone.shiga.jp":true,"koka.shiga.jp":true,"konan.shiga.jp":true,"kosei.shiga.jp":true,"koto.shiga.jp":true,"kusatsu.shiga.jp":true,"maibara.shiga.jp":true,"moriyama.shiga.jp":true,"nagahama.shiga.jp":true,"nishiazai.shiga.jp":true,"notogawa.shiga.jp":true,"omihachiman.shiga.jp":true,"otsu.shiga.jp":true,"ritto.shiga.jp":true,"ryuoh.shiga.jp":true,"takashima.shiga.jp":true,"takatsuki.shiga.jp":true,"torahime.shiga.jp":true,"toyosato.shiga.jp":true,"yasu.shiga.jp":true,"akagi.shimane.jp":true,"ama.shimane.jp":true,"gotsu.shimane.jp":true,"hamada.shimane.jp":true,"higashiizumo.shimane.jp":true,"hikawa.shimane.jp":true,"hikimi.shimane.jp":true,"izumo.shimane.jp":true,"kakinoki.shimane.jp":true,"masuda.shimane.jp":true,"matsue.shimane.jp":true,"misato.shimane.jp":true,"nishinoshima.shimane.jp":true,"ohda.shimane.jp":true,"okinoshima.shimane.jp":true,"okuizumo.shimane.jp":true,"shimane.shimane.jp":true,"tamayu.shimane.jp":true,"tsuwano.shimane.jp":true,"unnan.shimane.jp":true,"yakumo.shimane.jp":true,"yasugi.shimane.jp":true,"yatsuka.shimane.jp":true,"arai.shizuoka.jp":true,"atami.shizuoka.jp":true,"fuji.shizuoka.jp":true,"fujieda.shizuoka.jp":true,"fujikawa.shizuoka.jp":true,"fujinomiya.shizuoka.jp":true,"fukuroi.shizuoka.jp":true,"gotemba.shizuoka.jp":true,"haibara.shizuoka.jp":true,"hamamatsu.shizuoka.jp":true,"higashiizu.shizuoka.jp":true,"ito.shizuoka.jp":true,"iwata.shizuoka.jp":true,"izu.shizuoka.jp":true,"izunokuni.shizuoka.jp":true,"kakegawa.shizuoka.jp":true,"kannami.shizuoka.jp":true,"kawanehon.shizuoka.jp":true,"kawazu.shizuoka.jp":true,"kikugawa.shizuoka.jp":true,"kosai.shizuoka.jp":true,"makinohara.shizuoka.jp":true,"matsuzaki.shizuoka.jp":true,"minamiizu.shizuoka.jp":true,"mishima.shizuoka.jp":true,"morimachi.shizuoka.jp":true,"nishiizu.shizuoka.jp":true,"numazu.shizuoka.jp":true,"omaezaki.shizuoka.jp":true,"shimada.shizuoka.jp":true,"shimizu.shizuoka.jp":true,"shimoda.shizuoka.jp":true,"shizuoka.shizuoka.jp":true,"susono.shizuoka.jp":true,"yaizu.shizuoka.jp":true,"yoshida.shizuoka.jp":true,"ashikaga.tochigi.jp":true,"bato.tochigi.jp":true,"haga.tochigi.jp":true,"ichikai.tochigi.jp":true,"iwafune.tochigi.jp":true,"kaminokawa.tochigi.jp":true,"kanuma.tochigi.jp":true,"karasuyama.tochigi.jp":true,"kuroiso.tochigi.jp":true,"mashiko.tochigi.jp":true,"mibu.tochigi.jp":true,"moka.tochigi.jp":true,"motegi.tochigi.jp":true,"nasu.tochigi.jp":true,"nasushiobara.tochigi.jp":true,"nikko.tochigi.jp":true,"nishikata.tochigi.jp":true,"nogi.tochigi.jp":true,"ohira.tochigi.jp":true,"ohtawara.tochigi.jp":true,"oyama.tochigi.jp":true,"sakura.tochigi.jp":true,"sano.tochigi.jp":true,"shimotsuke.tochigi.jp":true,"shioya.tochigi.jp":true,"takanezawa.tochigi.jp":true,"tochigi.tochigi.jp":true,"tsuga.tochigi.jp":true,"ujiie.tochigi.jp":true,"utsunomiya.tochigi.jp":true,"yaita.tochigi.jp":true,"aizumi.tokushima.jp":true,"anan.tokushima.jp":true,"ichiba.tokushima.jp":true,"itano.tokushima.jp":true,"kainan.tokushima.jp":true,"komatsushima.tokushima.jp":true,"matsushige.tokushima.jp":true,"mima.tokushima.jp":true,"minami.tokushima.jp":true,"miyoshi.tokushima.jp":true,"mugi.tokushima.jp":true,"nakagawa.tokushima.jp":true,"naruto.tokushima.jp":true,"sanagochi.tokushima.jp":true,"shishikui.tokushima.jp":true,"tokushima.tokushima.jp":true,"wajiki.tokushima.jp":true,"adachi.tokyo.jp":true,"akiruno.tokyo.jp":true,"akishima.tokyo.jp":true,"aogashima.tokyo.jp":true,"arakawa.tokyo.jp":true,"bunkyo.tokyo.jp":true,"chiyoda.tokyo.jp":true,"chofu.tokyo.jp":true,"chuo.tokyo.jp":true,"edogawa.tokyo.jp":true,"fuchu.tokyo.jp":true,"fussa.tokyo.jp":true,"hachijo.tokyo.jp":true,"hachioji.tokyo.jp":true,"hamura.tokyo.jp":true,"higashikurume.tokyo.jp":true,"higashimurayama.tokyo.jp":true,"higashiyamato.tokyo.jp":true,"hino.tokyo.jp":true,"hinode.tokyo.jp":true,"hinohara.tokyo.jp":true,"inagi.tokyo.jp":true,"itabashi.tokyo.jp":true,"katsushika.tokyo.jp":true,"kita.tokyo.jp":true,"kiyose.tokyo.jp":true,"kodaira.tokyo.jp":true,"koganei.tokyo.jp":true,"kokubunji.tokyo.jp":true,"komae.tokyo.jp":true,"koto.tokyo.jp":true,"kouzushima.tokyo.jp":true,"kunitachi.tokyo.jp":true,"machida.tokyo.jp":true,"meguro.tokyo.jp":true,"minato.tokyo.jp":true,"mitaka.tokyo.jp":true,"mizuho.tokyo.jp":true,"musashimurayama.tokyo.jp":true,"musashino.tokyo.jp":true,"nakano.tokyo.jp":true,"nerima.tokyo.jp":true,"ogasawara.tokyo.jp":true,"okutama.tokyo.jp":true,"ome.tokyo.jp":true,"oshima.tokyo.jp":true,"ota.tokyo.jp":true,"setagaya.tokyo.jp":true,"shibuya.tokyo.jp":true,"shinagawa.tokyo.jp":true,"shinjuku.tokyo.jp":true,"suginami.tokyo.jp":true,"sumida.tokyo.jp":true,"tachikawa.tokyo.jp":true,"taito.tokyo.jp":true,"tama.tokyo.jp":true,"toshima.tokyo.jp":true,"chizu.tottori.jp":true,"hino.tottori.jp":true,"kawahara.tottori.jp":true,"koge.tottori.jp":true,"kotoura.tottori.jp":true,"misasa.tottori.jp":true,"nanbu.tottori.jp":true,"nichinan.tottori.jp":true,"sakaiminato.tottori.jp":true,"tottori.tottori.jp":true,"wakasa.tottori.jp":true,"yazu.tottori.jp":true,"yonago.tottori.jp":true,"asahi.toyama.jp":true,"fuchu.toyama.jp":true,"fukumitsu.toyama.jp":true,"funahashi.toyama.jp":true,"himi.toyama.jp":true,"imizu.toyama.jp":true,"inami.toyama.jp":true,"johana.toyama.jp":true,"kamiichi.toyama.jp":true,"kurobe.toyama.jp":true,"nakaniikawa.toyama.jp":true,"namerikawa.toyama.jp":true,"nanto.toyama.jp":true,"nyuzen.toyama.jp":true,"oyabe.toyama.jp":true,"taira.toyama.jp":true,"takaoka.toyama.jp":true,"tateyama.toyama.jp":true,"toga.toyama.jp":true,"tonami.toyama.jp":true,"toyama.toyama.jp":true,"unazuki.toyama.jp":true,"uozu.toyama.jp":true,"yamada.toyama.jp":true,"arida.wakayama.jp":true,"aridagawa.wakayama.jp":true,"gobo.wakayama.jp":true,"hashimoto.wakayama.jp":true,"hidaka.wakayama.jp":true,"hirogawa.wakayama.jp":true,"inami.wakayama.jp":true,"iwade.wakayama.jp":true,"kainan.wakayama.jp":true,"kamitonda.wakayama.jp":true,"katsuragi.wakayama.jp":true,"kimino.wakayama.jp":true,"kinokawa.wakayama.jp":true,"kitayama.wakayama.jp":true,"koya.wakayama.jp":true,"koza.wakayama.jp":true,"kozagawa.wakayama.jp":true,"kudoyama.wakayama.jp":true,"kushimoto.wakayama.jp":true,"mihama.wakayama.jp":true,"misato.wakayama.jp":true,"nachikatsuura.wakayama.jp":true,"shingu.wakayama.jp":true,"shirahama.wakayama.jp":true,"taiji.wakayama.jp":true,"tanabe.wakayama.jp":true,"wakayama.wakayama.jp":true,"yuasa.wakayama.jp":true,"yura.wakayama.jp":true,"asahi.yamagata.jp":true,"funagata.yamagata.jp":true,"higashine.yamagata.jp":true,"iide.yamagata.jp":true,"kahoku.yamagata.jp":true,"kaminoyama.yamagata.jp":true,"kaneyama.yamagata.jp":true,"kawanishi.yamagata.jp":true,"mamurogawa.yamagata.jp":true,"mikawa.yamagata.jp":true,"murayama.yamagata.jp":true,"nagai.yamagata.jp":true,"nakayama.yamagata.jp":true,"nanyo.yamagata.jp":true,"nishikawa.yamagata.jp":true,"obanazawa.yamagata.jp":true,"oe.yamagata.jp":true,"oguni.yamagata.jp":true,"ohkura.yamagata.jp":true,"oishida.yamagata.jp":true,"sagae.yamagata.jp":true,"sakata.yamagata.jp":true,"sakegawa.yamagata.jp":true,"shinjo.yamagata.jp":true,"shirataka.yamagata.jp":true,"shonai.yamagata.jp":true,"takahata.yamagata.jp":true,"tendo.yamagata.jp":true,"tozawa.yamagata.jp":true,"tsuruoka.yamagata.jp":true,"yamagata.yamagata.jp":true,"yamanobe.yamagata.jp":true,"yonezawa.yamagata.jp":true,"yuza.yamagata.jp":true,"abu.yamaguchi.jp":true,"hagi.yamaguchi.jp":true,"hikari.yamaguchi.jp":true,"hofu.yamaguchi.jp":true,"iwakuni.yamaguchi.jp":true,"kudamatsu.yamaguchi.jp":true,"mitou.yamaguchi.jp":true,"nagato.yamaguchi.jp":true,"oshima.yamaguchi.jp":true,"shimonoseki.yamaguchi.jp":true,"shunan.yamaguchi.jp":true,"tabuse.yamaguchi.jp":true,"tokuyama.yamaguchi.jp":true,"toyota.yamaguchi.jp":true,"ube.yamaguchi.jp":true,"yuu.yamaguchi.jp":true,"chuo.yamanashi.jp":true,"doshi.yamanashi.jp":true,"fuefuki.yamanashi.jp":true,"fujikawa.yamanashi.jp":true,"fujikawaguchiko.yamanashi.jp":true,"fujiyoshida.yamanashi.jp":true,"hayakawa.yamanashi.jp":true,"hokuto.yamanashi.jp":true,"ichikawamisato.yamanashi.jp":true,"kai.yamanashi.jp":true,"kofu.yamanashi.jp":true,"koshu.yamanashi.jp":true,"kosuge.yamanashi.jp":true,"minami-alps.yamanashi.jp":true,"minobu.yamanashi.jp":true,"nakamichi.yamanashi.jp":true,"nanbu.yamanashi.jp":true,"narusawa.yamanashi.jp":true,"nirasaki.yamanashi.jp":true,"nishikatsura.yamanashi.jp":true,"oshino.yamanashi.jp":true,"otsuki.yamanashi.jp":true,"showa.yamanashi.jp":true,"tabayama.yamanashi.jp":true,"tsuru.yamanashi.jp":true,"uenohara.yamanashi.jp":true,"yamanakako.yamanashi.jp":true,"yamanashi.yamanashi.jp":true,"ke":true,"ac.ke":true,"co.ke":true,"go.ke":true,"info.ke":true,"me.ke":true,"mobi.ke":true,"ne.ke":true,"or.ke":true,"sc.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"kp":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"lb":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"ac.lk":true,"lr":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"co.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"com.ms":true,"edu.ms":true,"gov.ms":true,"net.ms":true,"org.ms":true,"mt":true,"com.mt":true,"edu.mt":true,"net.mt":true,"org.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"mz":true,"ac.mz":true,"adv.mz":true,"co.mz":true,"edu.mz":true,"gov.mz":true,"mil.mz":true,"net.mz":true,"org.mz":true,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"nom.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ng":true,"com.ng":true,"edu.ng":true,"gov.ng":true,"i.ng":true,"mil.ng":true,"mobi.ng":true,"name.ng":true,"net.ng":true,"org.ng":true,"sch.ng":true,"ni":true,"ac.ni":true,"biz.ni":true,"co.ni":true,"com.ni":true,"edu.ni":true,"gob.ni":true,"in.ni":true,"info.ni":true,"int.ni":true,"mil.ni":true,"net.ni":true,"nom.ni":true,"org.ni":true,"web.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"nz":true,"ac.nz":true,"co.nz":true,"cri.nz":true,"geek.nz":true,"gen.nz":true,"govt.nz":true,"health.nz":true,"iwi.nz":true,"kiwi.nz":true,"maori.nz":true,"mil.nz":true,"xn--mori-qsa.nz":true,"net.nz":true,"org.nz":true,"parliament.nz":true,"school.nz":true,"om":true,"co.om":true,"com.om":true,"edu.om":true,"gov.om":true,"med.om":true,"museum.om":true,"net.om":true,"org.om":true,"pro.om":true,"onion":true,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"com.pl":true,"net.pl":true,"org.pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"info.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"gov.pl":true,"ap.gov.pl":true,"ic.gov.pl":true,"is.gov.pl":true,"us.gov.pl":true,"kmpsp.gov.pl":true,"kppsp.gov.pl":true,"kwpsp.gov.pl":true,"psp.gov.pl":true,"wskr.gov.pl":true,"kwp.gov.pl":true,"mw.gov.pl":true,"ug.gov.pl":true,"um.gov.pl":true,"umig.gov.pl":true,"ugim.gov.pl":true,"upow.gov.pl":true,"uw.gov.pl":true,"starostwo.gov.pl":true,"pa.gov.pl":true,"po.gov.pl":true,"psse.gov.pl":true,"pup.gov.pl":true,"rzgw.gov.pl":true,"sa.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"wsa.gov.pl":true,"sko.gov.pl":true,"uzs.gov.pl":true,"wiih.gov.pl":true,"winb.gov.pl":true,"pinb.gov.pl":true,"wios.gov.pl":true,"witd.gov.pl":true,"wzmiuw.gov.pl":true,"piw.gov.pl":true,"wiw.gov.pl":true,"griw.gov.pl":true,"wif.gov.pl":true,"oum.gov.pl":true,"sdn.gov.pl":true,"zp.gov.pl":true,"uppo.gov.pl":true,"mup.gov.pl":true,"wuoz.gov.pl":true,"konsulat.gov.pl":true,"oirm.gov.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"waw.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"post":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aaa.pro":true,"aca.pro":true,"acct.pro":true,"avocat.pro":true,"bar.pro":true,"cpa.pro":true,"eng.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"recht.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"py":true,"com.py":true,"coop.py":true,"edu.py":true,"gov.py":true,"mil.py":true,"net.py":true,"org.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"asso.re":true,"com.re":true,"nom.re":true,"ro":true,"arts.ro":true,"com.ro":true,"firm.ro":true,"info.ro":true,"nom.ro":true,"nt.ro":true,"org.ro":true,"rec.ro":true,"store.ro":true,"tm.ro":true,"www.ro":true,"rs":true,"ac.rs":true,"co.rs":true,"edu.rs":true,"gov.rs":true,"in.rs":true,"org.rs":true,"ru":true,"ac.ru":true,"edu.ru":true,"gov.ru":true,"int.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"tv.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"com.sh":true,"net.sh":true,"gov.sh":true,"org.sh":true,"mil.sh":true,"si":true,"sj":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"sv":true,"com.sv":true,"edu.sv":true,"gob.sv":true,"org.sv":true,"red.sv":true,"sx":true,"gov.sx":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"com.tm":true,"co.tm":true,"org.tm":true,"net.tm":true,"nom.tm":true,"gov.tm":true,"mil.tm":true,"edu.tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"tr":true,"com.tr":true,"info.tr":true,"biz.tr":true,"net.tr":true,"org.tr":true,"web.tr":true,"gen.tr":true,"tv.tr":true,"av.tr":true,"dr.tr":true,"bbs.tr":true,"name.tr":true,"tel.tr":true,"gov.tr":true,"bel.tr":true,"pol.tr":true,"mil.tr":true,"k12.tr":true,"edu.tr":true,"kep.tr":true,"nc.tr":true,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"tz":true,"ac.tz":true,"co.tz":true,"go.tz":true,"hotel.tz":true,"info.tz":true,"me.tz":true,"mil.tz":true,"mobi.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"tv.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"cherkasy.ua":true,"chernigov.ua":true,"chernihiv.ua":true,"chernivtsi.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"cr.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"dnipropetrovsk.ua":true,"dominic.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkiv.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"khmelnytskyi.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"krym.ua":true,"ks.ua":true,"kv.ua":true,"kyiv.ua":true,"lg.ua":true,"lt.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lv.ua":true,"lviv.ua":true,"mk.ua":true,"mykolaiv.ua":true,"nikolaev.ua":true,"od.ua":true,"odesa.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rivne.ua":true,"rovno.ua":true,"rv.ua":true,"sb.ua":true,"sebastopol.ua":true,"sevastopol.ua":true,"sm.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uz.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vinnytsia.ua":true,"vn.ua":true,"volyn.ua":true,"yalta.ua":true,"zaporizhzhe.ua":true,"zaporizhzhia.ua":true,"zhitomir.ua":true,"zhytomyr.ua":true,"zp.ua":true,"zt.ua":true,"ug":true,"co.ug":true,"or.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"com.ug":true,"org.ug":true,"uk":true,"ac.uk":true,"co.uk":true,"gov.uk":true,"ltd.uk":true,"me.uk":true,"net.uk":true,"nhs.uk":true,"org.uk":true,"plc.uk":true,"police.uk":true,"*.sch.uk":true,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"ann-arbor.mi.us":true,"cog.mi.us":true,"dst.mi.us":true,"eaton.mi.us":true,"gen.mi.us":true,"mus.mi.us":true,"tec.mi.us":true,"washtenaw.mi.us":true,"uy":true,"com.uy":true,"edu.uy":true,"gub.uy":true,"mil.uy":true,"net.uy":true,"org.uy":true,"uz":true,"co.uz":true,"com.uz":true,"net.uz":true,"org.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"ve":true,"arts.ve":true,"co.ve":true,"com.ve":true,"e12.ve":true,"edu.ve":true,"firm.ve":true,"gob.ve":true,"gov.ve":true,"info.ve":true,"int.ve":true,"mil.ve":true,"net.ve":true,"org.ve":true,"rec.ve":true,"store.ve":true,"tec.ve":true,"web.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"com.vu":true,"edu.vu":true,"net.vu":true,"org.vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--y9a3aq":true,"xn--54b7fta0cc":true,"xn--90ae":true,"xn--90ais":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--e1a4c":true,"xn--node":true,"xn--qxam":true,"xn--j6w193g":true,"xn--2scrj9c":true,"xn--3hcrj9c":true,"xn--45br5cyl":true,"xn--h2breg3eve":true,"xn--h2brj9c8c":true,"xn--mgbgu82a":true,"xn--rvc1e0am3e":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbtx2b":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--80ao21a":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--d1alf":true,"xn--l1acc":true,"xn--mix891f":true,"xn--mix082f":true,"xn--mgbx4cd0ab":true,"xn--mgb9awbf":true,"xn--mgbai9azgqp6j":true,"xn--mgbai9a5eva00b":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--o1ac.xn--90a3ac":true,"xn--c1avg.xn--90a3ac":true,"xn--90azh.xn--90a3ac":true,"xn--d1at.xn--90a3ac":true,"xn--o1ach.xn--90a3ac":true,"xn--80au.xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--mgbpl2fh":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--o3cw4h":true,"xn--12c1fe0br.xn--o3cw4h":true,"xn--12co0c3b4eva.xn--o3cw4h":true,"xn--h3cuzk1di.xn--o3cw4h":true,"xn--o3cyx2a.xn--o3cw4h":true,"xn--m3ch0j3a.xn--o3cw4h":true,"xn--12cfi8ixb8l.xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"ac.za":true,"agric.za":true,"alt.za":true,"co.za":true,"edu.za":true,"gov.za":true,"grondar.za":true,"law.za":true,"mil.za":true,"net.za":true,"ngo.za":true,"nis.za":true,"nom.za":true,"org.za":true,"school.za":true,"tm.za":true,"web.za":true,"zm":true,"ac.zm":true,"biz.zm":true,"co.zm":true,"com.zm":true,"edu.zm":true,"gov.zm":true,"info.zm":true,"mil.zm":true,"net.zm":true,"org.zm":true,"sch.zm":true,"zw":true,"ac.zw":true,"co.zw":true,"gov.zw":true,"mil.zw":true,"org.zw":true,"aaa":true,"aarp":true,"abarth":true,"abb":true,"abbott":true,"abbvie":true,"abc":true,"able":true,"abogado":true,"abudhabi":true,"academy":true,"accenture":true,"accountant":true,"accountants":true,"aco":true,"active":true,"actor":true,"adac":true,"ads":true,"adult":true,"aeg":true,"aetna":true,"afamilycompany":true,"afl":true,"africa":true,"agakhan":true,"agency":true,"aig":true,"aigo":true,"airbus":true,"airforce":true,"airtel":true,"akdn":true,"alfaromeo":true,"alibaba":true,"alipay":true,"allfinanz":true,"allstate":true,"ally":true,"alsace":true,"alstom":true,"americanexpress":true,"americanfamily":true,"amex":true,"amfam":true,"amica":true,"amsterdam":true,"analytics":true,"android":true,"anquan":true,"anz":true,"aol":true,"apartments":true,"app":true,"apple":true,"aquarelle":true,"arab":true,"aramco":true,"archi":true,"army":true,"art":true,"arte":true,"asda":true,"associates":true,"athleta":true,"attorney":true,"auction":true,"audi":true,"audible":true,"audio":true,"auspost":true,"author":true,"auto":true,"autos":true,"avianca":true,"aws":true,"axa":true,"azure":true,"baby":true,"baidu":true,"banamex":true,"bananarepublic":true,"band":true,"bank":true,"bar":true,"barcelona":true,"barclaycard":true,"barclays":true,"barefoot":true,"bargains":true,"baseball":true,"basketball":true,"bauhaus":true,"bayern":true,"bbc":true,"bbt":true,"bbva":true,"bcg":true,"bcn":true,"beats":true,"beauty":true,"beer":true,"bentley":true,"berlin":true,"best":true,"bestbuy":true,"bet":true,"bharti":true,"bible":true,"bid":true,"bike":true,"bing":true,"bingo":true,"bio":true,"black":true,"blackfriday":true,"blanco":true,"blockbuster":true,"blog":true,"bloomberg":true,"blue":true,"bms":true,"bmw":true,"bnl":true,"bnpparibas":true,"boats":true,"boehringer":true,"bofa":true,"bom":true,"bond":true,"boo":true,"book":true,"booking":true,"boots":true,"bosch":true,"bostik":true,"boston":true,"bot":true,"boutique":true,"box":true,"bradesco":true,"bridgestone":true,"broadway":true,"broker":true,"brother":true,"brussels":true,"budapest":true,"bugatti":true,"build":true,"builders":true,"business":true,"buy":true,"buzz":true,"bzh":true,"cab":true,"cafe":true,"cal":true,"call":true,"calvinklein":true,"cam":true,"camera":true,"camp":true,"cancerresearch":true,"canon":true,"capetown":true,"capital":true,"capitalone":true,"car":true,"caravan":true,"cards":true,"care":true,"career":true,"careers":true,"cars":true,"cartier":true,"casa":true,"case":true,"caseih":true,"cash":true,"casino":true,"catering":true,"catholic":true,"cba":true,"cbn":true,"cbre":true,"cbs":true,"ceb":true,"center":true,"ceo":true,"cern":true,"cfa":true,"cfd":true,"chanel":true,"channel":true,"chase":true,"chat":true,"cheap":true,"chintai":true,"christmas":true,"chrome":true,"chrysler":true,"church":true,"cipriani":true,"circle":true,"cisco":true,"citadel":true,"citi":true,"citic":true,"city":true,"cityeats":true,"claims":true,"cleaning":true,"click":true,"clinic":true,"clinique":true,"clothing":true,"cloud":true,"club":true,"clubmed":true,"coach":true,"codes":true,"coffee":true,"college":true,"cologne":true,"comcast":true,"commbank":true,"community":true,"company":true,"compare":true,"computer":true,"comsec":true,"condos":true,"construction":true,"consulting":true,"contact":true,"contractors":true,"cooking":true,"cookingchannel":true,"cool":true,"corsica":true,"country":true,"coupon":true,"coupons":true,"courses":true,"credit":true,"creditcard":true,"creditunion":true,"cricket":true,"crown":true,"crs":true,"cruise":true,"cruises":true,"csc":true,"cuisinella":true,"cymru":true,"cyou":true,"dabur":true,"dad":true,"dance":true,"data":true,"date":true,"dating":true,"datsun":true,"day":true,"dclk":true,"dds":true,"deal":true,"dealer":true,"deals":true,"degree":true,"delivery":true,"dell":true,"deloitte":true,"delta":true,"democrat":true,"dental":true,"dentist":true,"desi":true,"design":true,"dev":true,"dhl":true,"diamonds":true,"diet":true,"digital":true,"direct":true,"directory":true,"discount":true,"discover":true,"dish":true,"diy":true,"dnp":true,"docs":true,"doctor":true,"dodge":true,"dog":true,"doha":true,"domains":true,"dot":true,"download":true,"drive":true,"dtv":true,"dubai":true,"duck":true,"dunlop":true,"duns":true,"dupont":true,"durban":true,"dvag":true,"dvr":true,"earth":true,"eat":true,"eco":true,"edeka":true,"education":true,"email":true,"emerck":true,"energy":true,"engineer":true,"engineering":true,"enterprises":true,"epost":true,"epson":true,"equipment":true,"ericsson":true,"erni":true,"esq":true,"estate":true,"esurance":true,"etisalat":true,"eurovision":true,"eus":true,"events":true,"everbank":true,"exchange":true,"expert":true,"exposed":true,"express":true,"extraspace":true,"fage":true,"fail":true,"fairwinds":true,"faith":true,"family":true,"fan":true,"fans":true,"farm":true,"farmers":true,"fashion":true,"fast":true,"fedex":true,"feedback":true,"ferrari":true,"ferrero":true,"fiat":true,"fidelity":true,"fido":true,"film":true,"final":true,"finance":true,"financial":true,"fire":true,"firestone":true,"firmdale":true,"fish":true,"fishing":true,"fit":true,"fitness":true,"flickr":true,"flights":true,"flir":true,"florist":true,"flowers":true,"fly":true,"foo":true,"food":true,"foodnetwork":true,"football":true,"ford":true,"forex":true,"forsale":true,"forum":true,"foundation":true,"fox":true,"free":true,"fresenius":true,"frl":true,"frogans":true,"frontdoor":true,"frontier":true,"ftr":true,"fujitsu":true,"fujixerox":true,"fun":true,"fund":true,"furniture":true,"futbol":true,"fyi":true,"gal":true,"gallery":true,"gallo":true,"gallup":true,"game":true,"games":true,"gap":true,"garden":true,"gbiz":true,"gdn":true,"gea":true,"gent":true,"genting":true,"george":true,"ggee":true,"gift":true,"gifts":true,"gives":true,"giving":true,"glade":true,"glass":true,"gle":true,"global":true,"globo":true,"gmail":true,"gmbh":true,"gmo":true,"gmx":true,"godaddy":true,"gold":true,"goldpoint":true,"golf":true,"goo":true,"goodhands":true,"goodyear":true,"goog":true,"google":true,"gop":true,"got":true,"grainger":true,"graphics":true,"gratis":true,"green":true,"gripe":true,"grocery":true,"group":true,"guardian":true,"gucci":true,"guge":true,"guide":true,"guitars":true,"guru":true,"hair":true,"hamburg":true,"hangout":true,"haus":true,"hbo":true,"hdfc":true,"hdfcbank":true,"health":true,"healthcare":true,"help":true,"helsinki":true,"here":true,"hermes":true,"hgtv":true,"hiphop":true,"hisamitsu":true,"hitachi":true,"hiv":true,"hkt":true,"hockey":true,"holdings":true,"holiday":true,"homedepot":true,"homegoods":true,"homes":true,"homesense":true,"honda":true,"honeywell":true,"horse":true,"hospital":true,"host":true,"hosting":true,"hot":true,"hoteles":true,"hotels":true,"hotmail":true,"house":true,"how":true,"hsbc":true,"hughes":true,"hyatt":true,"hyundai":true,"ibm":true,"icbc":true,"ice":true,"icu":true,"ieee":true,"ifm":true,"ikano":true,"imamat":true,"imdb":true,"immo":true,"immobilien":true,"industries":true,"infiniti":true,"ing":true,"ink":true,"institute":true,"insurance":true,"insure":true,"intel":true,"international":true,"intuit":true,"investments":true,"ipiranga":true,"irish":true,"iselect":true,"ismaili":true,"ist":true,"istanbul":true,"itau":true,"itv":true,"iveco":true,"iwc":true,"jaguar":true,"java":true,"jcb":true,"jcp":true,"jeep":true,"jetzt":true,"jewelry":true,"jio":true,"jlc":true,"jll":true,"jmp":true,"jnj":true,"joburg":true,"jot":true,"joy":true,"jpmorgan":true,"jprs":true,"juegos":true,"juniper":true,"kaufen":true,"kddi":true,"kerryhotels":true,"kerrylogistics":true,"kerryproperties":true,"kfh":true,"kia":true,"kim":true,"kinder":true,"kindle":true,"kitchen":true,"kiwi":true,"koeln":true,"komatsu":true,"kosher":true,"kpmg":true,"kpn":true,"krd":true,"kred":true,"kuokgroup":true,"kyoto":true,"lacaixa":true,"ladbrokes":true,"lamborghini":true,"lamer":true,"lancaster":true,"lancia":true,"lancome":true,"land":true,"landrover":true,"lanxess":true,"lasalle":true,"lat":true,"latino":true,"latrobe":true,"law":true,"lawyer":true,"lds":true,"lease":true,"leclerc":true,"lefrak":true,"legal":true,"lego":true,"lexus":true,"lgbt":true,"liaison":true,"lidl":true,"life":true,"lifeinsurance":true,"lifestyle":true,"lighting":true,"like":true,"lilly":true,"limited":true,"limo":true,"lincoln":true,"linde":true,"link":true,"lipsy":true,"live":true,"living":true,"lixil":true,"loan":true,"loans":true,"locker":true,"locus":true,"loft":true,"lol":true,"london":true,"lotte":true,"lotto":true,"love":true,"lpl":true,"lplfinancial":true,"ltd":true,"ltda":true,"lundbeck":true,"lupin":true,"luxe":true,"luxury":true,"macys":true,"madrid":true,"maif":true,"maison":true,"makeup":true,"man":true,"management":true,"mango":true,"map":true,"market":true,"marketing":true,"markets":true,"marriott":true,"marshalls":true,"maserati":true,"mattel":true,"mba":true,"mckinsey":true,"med":true,"media":true,"meet":true,"melbourne":true,"meme":true,"memorial":true,"men":true,"menu":true,"meo":true,"merckmsd":true,"metlife":true,"miami":true,"microsoft":true,"mini":true,"mint":true,"mit":true,"mitsubishi":true,"mlb":true,"mls":true,"mma":true,"mobile":true,"mobily":true,"moda":true,"moe":true,"moi":true,"mom":true,"monash":true,"money":true,"monster":true,"mopar":true,"mormon":true,"mortgage":true,"moscow":true,"moto":true,"motorcycles":true,"mov":true,"movie":true,"movistar":true,"msd":true,"mtn":true,"mtpc":true,"mtr":true,"mutual":true,"nab":true,"nadex":true,"nagoya":true,"nationwide":true,"natura":true,"navy":true,"nba":true,"nec":true,"netbank":true,"netflix":true,"network":true,"neustar":true,"new":true,"newholland":true,"news":true,"next":true,"nextdirect":true,"nexus":true,"nfl":true,"ngo":true,"nhk":true,"nico":true,"nike":true,"nikon":true,"ninja":true,"nissan":true,"nissay":true,"nokia":true,"northwesternmutual":true,"norton":true,"now":true,"nowruz":true,"nowtv":true,"nra":true,"nrw":true,"ntt":true,"nyc":true,"obi":true,"observer":true,"off":true,"office":true,"okinawa":true,"olayan":true,"olayangroup":true,"oldnavy":true,"ollo":true,"omega":true,"one":true,"ong":true,"onl":true,"online":true,"onyourside":true,"ooo":true,"open":true,"oracle":true,"orange":true,"organic":true,"origins":true,"osaka":true,"otsuka":true,"ott":true,"ovh":true,"page":true,"panasonic":true,"panerai":true,"paris":true,"pars":true,"partners":true,"parts":true,"party":true,"passagens":true,"pay":true,"pccw":true,"pet":true,"pfizer":true,"pharmacy":true,"phd":true,"philips":true,"phone":true,"photo":true,"photography":true,"photos":true,"physio":true,"piaget":true,"pics":true,"pictet":true,"pictures":true,"pid":true,"pin":true,"ping":true,"pink":true,"pioneer":true,"pizza":true,"place":true,"play":true,"playstation":true,"plumbing":true,"plus":true,"pnc":true,"pohl":true,"poker":true,"politie":true,"porn":true,"pramerica":true,"praxi":true,"press":true,"prime":true,"prod":true,"productions":true,"prof":true,"progressive":true,"promo":true,"properties":true,"property":true,"protection":true,"pru":true,"prudential":true,"pub":true,"pwc":true,"qpon":true,"quebec":true,"quest":true,"qvc":true,"racing":true,"radio":true,"raid":true,"read":true,"realestate":true,"realtor":true,"realty":true,"recipes":true,"red":true,"redstone":true,"redumbrella":true,"rehab":true,"reise":true,"reisen":true,"reit":true,"reliance":true,"ren":true,"rent":true,"rentals":true,"repair":true,"report":true,"republican":true,"rest":true,"restaurant":true,"review":true,"reviews":true,"rexroth":true,"rich":true,"richardli":true,"ricoh":true,"rightathome":true,"ril":true,"rio":true,"rip":true,"rmit":true,"rocher":true,"rocks":true,"rodeo":true,"rogers":true,"room":true,"rsvp":true,"rugby":true,"ruhr":true,"run":true,"rwe":true,"ryukyu":true,"saarland":true,"safe":true,"safety":true,"sakura":true,"sale":true,"salon":true,"samsclub":true,"samsung":true,"sandvik":true,"sandvikcoromant":true,"sanofi":true,"sap":true,"sapo":true,"sarl":true,"sas":true,"save":true,"saxo":true,"sbi":true,"sbs":true,"sca":true,"scb":true,"schaeffler":true,"schmidt":true,"scholarships":true,"school":true,"schule":true,"schwarz":true,"science":true,"scjohnson":true,"scor":true,"scot":true,"search":true,"seat":true,"secure":true,"security":true,"seek":true,"select":true,"sener":true,"services":true,"ses":true,"seven":true,"sew":true,"sex":true,"sexy":true,"sfr":true,"shangrila":true,"sharp":true,"shaw":true,"shell":true,"shia":true,"shiksha":true,"shoes":true,"shop":true,"shopping":true,"shouji":true,"show":true,"showtime":true,"shriram":true,"silk":true,"sina":true,"singles":true,"site":true,"ski":true,"skin":true,"sky":true,"skype":true,"sling":true,"smart":true,"smile":true,"sncf":true,"soccer":true,"social":true,"softbank":true,"software":true,"sohu":true,"solar":true,"solutions":true,"song":true,"sony":true,"soy":true,"space":true,"spiegel":true,"spot":true,"spreadbetting":true,"srl":true,"srt":true,"stada":true,"staples":true,"star":true,"starhub":true,"statebank":true,"statefarm":true,"statoil":true,"stc":true,"stcgroup":true,"stockholm":true,"storage":true,"store":true,"stream":true,"studio":true,"study":true,"style":true,"sucks":true,"supplies":true,"supply":true,"support":true,"surf":true,"surgery":true,"suzuki":true,"swatch":true,"swiftcover":true,"swiss":true,"sydney":true,"symantec":true,"systems":true,"tab":true,"taipei":true,"talk":true,"taobao":true,"target":true,"tatamotors":true,"tatar":true,"tattoo":true,"tax":true,"taxi":true,"tci":true,"tdk":true,"team":true,"tech":true,"technology":true,"telecity":true,"telefonica":true,"temasek":true,"tennis":true,"teva":true,"thd":true,"theater":true,"theatre":true,"tiaa":true,"tickets":true,"tienda":true,"tiffany":true,"tips":true,"tires":true,"tirol":true,"tjmaxx":true,"tjx":true,"tkmaxx":true,"tmall":true,"today":true,"tokyo":true,"tools":true,"top":true,"toray":true,"toshiba":true,"total":true,"tours":true,"town":true,"toyota":true,"toys":true,"trade":true,"trading":true,"training":true,"travelchannel":true,"travelers":true,"travelersinsurance":true,"trust":true,"trv":true,"tube":true,"tui":true,"tunes":true,"tushu":true,"tvs":true,"ubank":true,"ubs":true,"uconnect":true,"unicom":true,"university":true,"uno":true,"uol":true,"ups":true,"vacations":true,"vana":true,"vanguard":true,"vegas":true,"ventures":true,"verisign":true,"versicherung":true,"vet":true,"viajes":true,"video":true,"vig":true,"viking":true,"villas":true,"vin":true,"vip":true,"virgin":true,"visa":true,"vision":true,"vista":true,"vistaprint":true,"viva":true,"vivo":true,"vlaanderen":true,"vodka":true,"volkswagen":true,"volvo":true,"vote":true,"voting":true,"voto":true,"voyage":true,"vuelos":true,"wales":true,"walmart":true,"walter":true,"wang":true,"wanggou":true,"warman":true,"watch":true,"watches":true,"weather":true,"weatherchannel":true,"webcam":true,"weber":true,"website":true,"wed":true,"wedding":true,"weibo":true,"weir":true,"whoswho":true,"wien":true,"wiki":true,"williamhill":true,"win":true,"windows":true,"wine":true,"winners":true,"wme":true,"wolterskluwer":true,"woodside":true,"work":true,"works":true,"world":true,"wow":true,"wtc":true,"wtf":true,"xbox":true,"xerox":true,"xfinity":true,"xihuan":true,"xin":true,"xn--11b4c3d":true,"xn--1ck2e1b":true,"xn--1qqw23a":true,"xn--30rr7y":true,"xn--3bst00m":true,"xn--3ds443g":true,"xn--3oq18vl8pn36a":true,"xn--3pxu8k":true,"xn--42c2d9a":true,"xn--45q11c":true,"xn--4gbrim":true,"xn--55qw42g":true,"xn--55qx5d":true,"xn--5su34j936bgsg":true,"xn--5tzm5g":true,"xn--6frz82g":true,"xn--6qq986b3xl":true,"xn--80adxhks":true,"xn--80aqecdr1a":true,"xn--80asehdb":true,"xn--80aswg":true,"xn--8y0a063a":true,"xn--9dbq2a":true,"xn--9et52u":true,"xn--9krt00a":true,"xn--b4w605ferd":true,"xn--bck1b9a5dre4c":true,"xn--c1avg":true,"xn--c2br7g":true,"xn--cck2b3b":true,"xn--cg4bki":true,"xn--czr694b":true,"xn--czrs0t":true,"xn--czru2d":true,"xn--d1acj3b":true,"xn--eckvdtc9d":true,"xn--efvy88h":true,"xn--estv75g":true,"xn--fct429k":true,"xn--fhbei":true,"xn--fiq228c5hs":true,"xn--fiq64b":true,"xn--fjq720a":true,"xn--flw351e":true,"xn--fzys8d69uvgm":true,"xn--g2xx48c":true,"xn--gckr3f0f":true,"xn--gk3at1e":true,"xn--hxt814e":true,"xn--i1b6b1a6a2e":true,"xn--imr513n":true,"xn--io0a7i":true,"xn--j1aef":true,"xn--jlq61u9w7b":true,"xn--jvr189m":true,"xn--kcrx77d1x4a":true,"xn--kpu716f":true,"xn--kput3i":true,"xn--mgba3a3ejt":true,"xn--mgba7c0bbn0a":true,"xn--mgbaakc7dvf":true,"xn--mgbab2bd":true,"xn--mgbb9fbpob":true,"xn--mgbca7dzdo":true,"xn--mgbi4ecexp":true,"xn--mgbt3dhd":true,"xn--mk1bu44c":true,"xn--mxtq1m":true,"xn--ngbc5azd":true,"xn--ngbe9e0a":true,"xn--ngbrx":true,"xn--nqv7f":true,"xn--nqv7fs00ema":true,"xn--nyqy26a":true,"xn--p1acf":true,"xn--pbt977c":true,"xn--pssy2u":true,"xn--q9jyb4c":true,"xn--qcka1pmc":true,"xn--rhqv96g":true,"xn--rovu88b":true,"xn--ses554g":true,"xn--t60b56a":true,"xn--tckwe":true,"xn--tiq49xqyj":true,"xn--unup4y":true,"xn--vermgensberater-ctb":true,"xn--vermgensberatung-pwb":true,"xn--vhquv":true,"xn--vuq861b":true,"xn--w4r85el8fhu5dnra":true,"xn--w4rs40l":true,"xn--xhq521b":true,"xn--zfr164b":true,"xperia":true,"xyz":true,"yachts":true,"yahoo":true,"yamaxun":true,"yandex":true,"yodobashi":true,"yoga":true,"yokohama":true,"you":true,"youtube":true,"yun":true,"zappos":true,"zara":true,"zero":true,"zip":true,"zippo":true,"zone":true,"zuerich":true,"cc.ua":true,"inf.ua":true,"ltd.ua":true,"1password.ca":true,"1password.com":true,"1password.eu":true,"beep.pl":true,"*.compute.estate":true,"*.alces.network":true,"alwaysdata.net":true,"cloudfront.net":true,"*.compute.amazonaws.com":true,"*.compute-1.amazonaws.com":true,"*.compute.amazonaws.com.cn":true,"us-east-1.amazonaws.com":true,"cn-north-1.eb.amazonaws.com.cn":true,"elasticbeanstalk.com":true,"ap-northeast-1.elasticbeanstalk.com":true,"ap-northeast-2.elasticbeanstalk.com":true,"ap-south-1.elasticbeanstalk.com":true,"ap-southeast-1.elasticbeanstalk.com":true,"ap-southeast-2.elasticbeanstalk.com":true,"ca-central-1.elasticbeanstalk.com":true,"eu-central-1.elasticbeanstalk.com":true,"eu-west-1.elasticbeanstalk.com":true,"eu-west-2.elasticbeanstalk.com":true,"eu-west-3.elasticbeanstalk.com":true,"sa-east-1.elasticbeanstalk.com":true,"us-east-1.elasticbeanstalk.com":true,"us-east-2.elasticbeanstalk.com":true,"us-gov-west-1.elasticbeanstalk.com":true,"us-west-1.elasticbeanstalk.com":true,"us-west-2.elasticbeanstalk.com":true,"*.elb.amazonaws.com":true,"*.elb.amazonaws.com.cn":true,"s3.amazonaws.com":true,"s3-ap-northeast-1.amazonaws.com":true,"s3-ap-northeast-2.amazonaws.com":true,"s3-ap-south-1.amazonaws.com":true,"s3-ap-southeast-1.amazonaws.com":true,"s3-ap-southeast-2.amazonaws.com":true,"s3-ca-central-1.amazonaws.com":true,"s3-eu-central-1.amazonaws.com":true,"s3-eu-west-1.amazonaws.com":true,"s3-eu-west-2.amazonaws.com":true,"s3-eu-west-3.amazonaws.com":true,"s3-external-1.amazonaws.com":true,"s3-fips-us-gov-west-1.amazonaws.com":true,"s3-sa-east-1.amazonaws.com":true,"s3-us-gov-west-1.amazonaws.com":true,"s3-us-east-2.amazonaws.com":true,"s3-us-west-1.amazonaws.com":true,"s3-us-west-2.amazonaws.com":true,"s3.ap-northeast-2.amazonaws.com":true,"s3.ap-south-1.amazonaws.com":true,"s3.cn-north-1.amazonaws.com.cn":true,"s3.ca-central-1.amazonaws.com":true,"s3.eu-central-1.amazonaws.com":true,"s3.eu-west-2.amazonaws.com":true,"s3.eu-west-3.amazonaws.com":true,"s3.us-east-2.amazonaws.com":true,"s3.dualstack.ap-northeast-1.amazonaws.com":true,"s3.dualstack.ap-northeast-2.amazonaws.com":true,"s3.dualstack.ap-south-1.amazonaws.com":true,"s3.dualstack.ap-southeast-1.amazonaws.com":true,"s3.dualstack.ap-southeast-2.amazonaws.com":true,"s3.dualstack.ca-central-1.amazonaws.com":true,"s3.dualstack.eu-central-1.amazonaws.com":true,"s3.dualstack.eu-west-1.amazonaws.com":true,"s3.dualstack.eu-west-2.amazonaws.com":true,"s3.dualstack.eu-west-3.amazonaws.com":true,"s3.dualstack.sa-east-1.amazonaws.com":true,"s3.dualstack.us-east-1.amazonaws.com":true,"s3.dualstack.us-east-2.amazonaws.com":true,"s3-website-us-east-1.amazonaws.com":true,"s3-website-us-west-1.amazonaws.com":true,"s3-website-us-west-2.amazonaws.com":true,"s3-website-ap-northeast-1.amazonaws.com":true,"s3-website-ap-southeast-1.amazonaws.com":true,"s3-website-ap-southeast-2.amazonaws.com":true,"s3-website-eu-west-1.amazonaws.com":true,"s3-website-sa-east-1.amazonaws.com":true,"s3-website.ap-northeast-2.amazonaws.com":true,"s3-website.ap-south-1.amazonaws.com":true,"s3-website.ca-central-1.amazonaws.com":true,"s3-website.eu-central-1.amazonaws.com":true,"s3-website.eu-west-2.amazonaws.com":true,"s3-website.eu-west-3.amazonaws.com":true,"s3-website.us-east-2.amazonaws.com":true,"t3l3p0rt.net":true,"tele.amune.org":true,"on-aptible.com":true,"user.party.eus":true,"pimienta.org":true,"poivron.org":true,"potager.org":true,"sweetpepper.org":true,"myasustor.com":true,"myfritz.net":true,"*.awdev.ca":true,"*.advisor.ws":true,"backplaneapp.io":true,"betainabox.com":true,"bnr.la":true,"boomla.net":true,"boxfuse.io":true,"square7.ch":true,"bplaced.com":true,"bplaced.de":true,"square7.de":true,"bplaced.net":true,"square7.net":true,"browsersafetymark.io":true,"mycd.eu":true,"ae.org":true,"ar.com":true,"br.com":true,"cn.com":true,"com.de":true,"com.se":true,"de.com":true,"eu.com":true,"gb.com":true,"gb.net":true,"hu.com":true,"hu.net":true,"jp.net":true,"jpn.com":true,"kr.com":true,"mex.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"se.net":true,"uk.com":true,"uk.net":true,"us.com":true,"uy.com":true,"za.bz":true,"za.com":true,"africa.com":true,"gr.com":true,"in.net":true,"us.org":true,"co.com":true,"c.la":true,"certmgr.org":true,"xenapponazure.com":true,"virtueeldomein.nl":true,"c66.me":true,"cloud66.ws":true,"jdevcloud.com":true,"wpdevcloud.com":true,"cloudaccess.host":true,"freesite.host":true,"cloudaccess.net":true,"cloudcontrolled.com":true,"cloudcontrolapp.com":true,"co.ca":true,"co.cz":true,"c.cdn77.org":true,"cdn77-ssl.net":true,"r.cdn77.net":true,"rsc.cdn77.org":true,"ssl.origin.cdn77-secure.org":true,"cloudns.asia":true,"cloudns.biz":true,"cloudns.club":true,"cloudns.cc":true,"cloudns.eu":true,"cloudns.in":true,"cloudns.info":true,"cloudns.org":true,"cloudns.pro":true,"cloudns.pw":true,"cloudns.us":true,"co.nl":true,"co.no":true,"webhosting.be":true,"hosting-cluster.nl":true,"dyn.cosidns.de":true,"dynamisches-dns.de":true,"dnsupdater.de":true,"internet-dns.de":true,"l-o-g-i-n.de":true,"dynamic-dns.info":true,"feste-ip.net":true,"knx-server.net":true,"static-access.net":true,"realm.cz":true,"*.cryptonomic.net":true,"cupcake.is":true,"cyon.link":true,"cyon.site":true,"daplie.me":true,"localhost.daplie.me":true,"biz.dk":true,"co.dk":true,"firm.dk":true,"reg.dk":true,"store.dk":true,"debian.net":true,"dedyn.io":true,"dnshome.de":true,"drayddns.com":true,"dreamhosters.com":true,"mydrobo.com":true,"drud.io":true,"drud.us":true,"duckdns.org":true,"dy.fi":true,"tunk.org":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true,"ddnss.de":true,"dyn.ddnss.de":true,"dyndns.ddnss.de":true,"dyndns1.de":true,"dyn-ip24.de":true,"home-webserver.de":true,"dyn.home-webserver.de":true,"myhome-server.de":true,"ddnss.org":true,"definima.net":true,"definima.io":true,"ddnsfree.com":true,"ddnsgeek.com":true,"giize.com":true,"gleeze.com":true,"kozow.com":true,"loseyourip.com":true,"ooguy.com":true,"theworkpc.com":true,"casacam.net":true,"dynu.net":true,"accesscam.org":true,"camdvr.org":true,"freeddns.org":true,"mywire.org":true,"webredirect.org":true,"myddns.rocks":true,"blogsite.xyz":true,"dynv6.net":true,"e4.cz":true,"mytuleap.com":true,"enonic.io":true,"customer.enonic.io":true,"eu.org":true,"al.eu.org":true,"asso.eu.org":true,"at.eu.org":true,"au.eu.org":true,"be.eu.org":true,"bg.eu.org":true,"ca.eu.org":true,"cd.eu.org":true,"ch.eu.org":true,"cn.eu.org":true,"cy.eu.org":true,"cz.eu.org":true,"de.eu.org":true,"dk.eu.org":true,"edu.eu.org":true,"ee.eu.org":true,"es.eu.org":true,"fi.eu.org":true,"fr.eu.org":true,"gr.eu.org":true,"hr.eu.org":true,"hu.eu.org":true,"ie.eu.org":true,"il.eu.org":true,"in.eu.org":true,"int.eu.org":true,"is.eu.org":true,"it.eu.org":true,"jp.eu.org":true,"kr.eu.org":true,"lt.eu.org":true,"lu.eu.org":true,"lv.eu.org":true,"mc.eu.org":true,"me.eu.org":true,"mk.eu.org":true,"mt.eu.org":true,"my.eu.org":true,"net.eu.org":true,"ng.eu.org":true,"nl.eu.org":true,"no.eu.org":true,"nz.eu.org":true,"paris.eu.org":true,"pl.eu.org":true,"pt.eu.org":true,"q-a.eu.org":true,"ro.eu.org":true,"ru.eu.org":true,"se.eu.org":true,"si.eu.org":true,"sk.eu.org":true,"tr.eu.org":true,"uk.eu.org":true,"us.eu.org":true,"eu-1.evennode.com":true,"eu-2.evennode.com":true,"eu-3.evennode.com":true,"eu-4.evennode.com":true,"us-1.evennode.com":true,"us-2.evennode.com":true,"us-3.evennode.com":true,"us-4.evennode.com":true,"twmail.cc":true,"twmail.net":true,"twmail.org":true,"mymailer.com.tw":true,"url.tw":true,"apps.fbsbx.com":true,"ru.net":true,"adygeya.ru":true,"bashkiria.ru":true,"bir.ru":true,"cbg.ru":true,"com.ru":true,"dagestan.ru":true,"grozny.ru":true,"kalmykia.ru":true,"kustanai.ru":true,"marine.ru":true,"mordovia.ru":true,"msk.ru":true,"mytis.ru":true,"nalchik.ru":true,"nov.ru":true,"pyatigorsk.ru":true,"spb.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"abkhazia.su":true,"adygeya.su":true,"aktyubinsk.su":true,"arkhangelsk.su":true,"armenia.su":true,"ashgabad.su":true,"azerbaijan.su":true,"balashov.su":true,"bashkiria.su":true,"bryansk.su":true,"bukhara.su":true,"chimkent.su":true,"dagestan.su":true,"east-kazakhstan.su":true,"exnet.su":true,"georgia.su":true,"grozny.su":true,"ivanovo.su":true,"jambyl.su":true,"kalmykia.su":true,"kaluga.su":true,"karacol.su":true,"karaganda.su":true,"karelia.su":true,"khakassia.su":true,"krasnodar.su":true,"kurgan.su":true,"kustanai.su":true,"lenug.su":true,"mangyshlak.su":true,"mordovia.su":true,"msk.su":true,"murmansk.su":true,"nalchik.su":true,"navoi.su":true,"north-kazakhstan.su":true,"nov.su":true,"obninsk.su":true,"penza.su":true,"pokrovsk.su":true,"sochi.su":true,"spb.su":true,"tashkent.su":true,"termez.su":true,"togliatti.su":true,"troitsk.su":true,"tselinograd.su":true,"tula.su":true,"tuva.su":true,"vladikavkaz.su":true,"vladimir.su":true,"vologda.su":true,"channelsdvr.net":true,"fastlylb.net":true,"map.fastlylb.net":true,"freetls.fastly.net":true,"map.fastly.net":true,"a.prod.fastly.net":true,"global.prod.fastly.net":true,"a.ssl.fastly.net":true,"b.ssl.fastly.net":true,"global.ssl.fastly.net":true,"fhapp.xyz":true,"fedorainfracloud.org":true,"fedorapeople.org":true,"cloud.fedoraproject.org":true,"app.os.fedoraproject.org":true,"app.os.stg.fedoraproject.org":true,"filegear.me":true,"firebaseapp.com":true,"flynnhub.com":true,"flynnhosting.net":true,"freebox-os.com":true,"freeboxos.com":true,"fbx-os.fr":true,"fbxos.fr":true,"freebox-os.fr":true,"freeboxos.fr":true,"*.futurecms.at":true,"futurehosting.at":true,"futuremailing.at":true,"*.ex.ortsinfo.at":true,"*.kunden.ortsinfo.at":true,"*.statics.cloud":true,"service.gov.uk":true,"github.io":true,"githubusercontent.com":true,"gitlab.io":true,"homeoffice.gov.uk":true,"ro.im":true,"shop.ro":true,"goip.de":true,"*.0emm.com":true,"appspot.com":true,"blogspot.ae":true,"blogspot.al":true,"blogspot.am":true,"blogspot.ba":true,"blogspot.be":true,"blogspot.bg":true,"blogspot.bj":true,"blogspot.ca":true,"blogspot.cf":true,"blogspot.ch":true,"blogspot.cl":true,"blogspot.co.at":true,"blogspot.co.id":true,"blogspot.co.il":true,"blogspot.co.ke":true,"blogspot.co.nz":true,"blogspot.co.uk":true,"blogspot.co.za":true,"blogspot.com":true,"blogspot.com.ar":true,"blogspot.com.au":true,"blogspot.com.br":true,"blogspot.com.by":true,"blogspot.com.co":true,"blogspot.com.cy":true,"blogspot.com.ee":true,"blogspot.com.eg":true,"blogspot.com.es":true,"blogspot.com.mt":true,"blogspot.com.ng":true,"blogspot.com.tr":true,"blogspot.com.uy":true,"blogspot.cv":true,"blogspot.cz":true,"blogspot.de":true,"blogspot.dk":true,"blogspot.fi":true,"blogspot.fr":true,"blogspot.gr":true,"blogspot.hk":true,"blogspot.hr":true,"blogspot.hu":true,"blogspot.ie":true,"blogspot.in":true,"blogspot.is":true,"blogspot.it":true,"blogspot.jp":true,"blogspot.kr":true,"blogspot.li":true,"blogspot.lt":true,"blogspot.lu":true,"blogspot.md":true,"blogspot.mk":true,"blogspot.mr":true,"blogspot.mx":true,"blogspot.my":true,"blogspot.nl":true,"blogspot.no":true,"blogspot.pe":true,"blogspot.pt":true,"blogspot.qa":true,"blogspot.re":true,"blogspot.ro":true,"blogspot.rs":true,"blogspot.ru":true,"blogspot.se":true,"blogspot.sg":true,"blogspot.si":true,"blogspot.sk":true,"blogspot.sn":true,"blogspot.td":true,"blogspot.tw":true,"blogspot.ug":true,"blogspot.vn":true,"cloudfunctions.net":true,"cloud.goog":true,"codespot.com":true,"googleapis.com":true,"googlecode.com":true,"pagespeedmobilizer.com":true,"publishproxy.com":true,"withgoogle.com":true,"withyoutube.com":true,"hashbang.sh":true,"hasura-app.io":true,"hepforge.org":true,"herokuapp.com":true,"herokussl.com":true,"moonscale.net":true,"iki.fi":true,"biz.at":true,"info.at":true,"info.cx":true,"ac.leg.br":true,"al.leg.br":true,"am.leg.br":true,"ap.leg.br":true,"ba.leg.br":true,"ce.leg.br":true,"df.leg.br":true,"es.leg.br":true,"go.leg.br":true,"ma.leg.br":true,"mg.leg.br":true,"ms.leg.br":true,"mt.leg.br":true,"pa.leg.br":true,"pb.leg.br":true,"pe.leg.br":true,"pi.leg.br":true,"pr.leg.br":true,"rj.leg.br":true,"rn.leg.br":true,"ro.leg.br":true,"rr.leg.br":true,"rs.leg.br":true,"sc.leg.br":true,"se.leg.br":true,"sp.leg.br":true,"to.leg.br":true,"pixolino.com":true,"ipifony.net":true,"*.triton.zone":true,"*.cns.joyent.com":true,"js.org":true,"keymachine.de":true,"knightpoint.systems":true,"co.krd":true,"edu.krd":true,"git-repos.de":true,"lcube-server.de":true,"svn-repos.de":true,"linkyard.cloud":true,"linkyard-cloud.ch":true,"we.bs":true,"barsy.bg":true,"barsyonline.com":true,"barsy.de":true,"barsy.eu":true,"barsy.in":true,"barsy.net":true,"barsy.online":true,"barsy.support":true,"*.magentosite.cloud":true,"hb.cldmail.ru":true,"cloud.metacentrum.cz":true,"custom.metacentrum.cz":true,"meteorapp.com":true,"eu.meteorapp.com":true,"co.pl":true,"azurewebsites.net":true,"azure-mobile.net":true,"cloudapp.net":true,"mozilla-iot.org":true,"bmoattachments.org":true,"net.ru":true,"org.ru":true,"pp.ru":true,"bitballoon.com":true,"netlify.com":true,"4u.com":true,"ngrok.io":true,"nh-serv.co.uk":true,"nfshost.com":true,"nsupdate.info":true,"nerdpol.ovh":true,"blogsyte.com":true,"brasilia.me":true,"cable-modem.org":true,"ciscofreak.com":true,"collegefan.org":true,"couchpotatofries.org":true,"damnserver.com":true,"ddns.me":true,"ditchyourip.com":true,"dnsfor.me":true,"dnsiskinky.com":true,"dvrcam.info":true,"dynns.com":true,"eating-organic.net":true,"fantasyleague.cc":true,"geekgalaxy.com":true,"golffan.us":true,"health-carereform.com":true,"homesecuritymac.com":true,"homesecuritypc.com":true,"hopto.me":true,"ilovecollege.info":true,"loginto.me":true,"mlbfan.org":true,"mmafan.biz":true,"myactivedirectory.com":true,"mydissent.net":true,"myeffect.net":true,"mymediapc.net":true,"mypsx.net":true,"mysecuritycamera.com":true,"mysecuritycamera.net":true,"mysecuritycamera.org":true,"net-freaks.com":true,"nflfan.org":true,"nhlfan.net":true,"no-ip.ca":true,"no-ip.co.uk":true,"no-ip.net":true,"noip.us":true,"onthewifi.com":true,"pgafan.net":true,"point2this.com":true,"pointto.us":true,"privatizehealthinsurance.net":true,"quicksytes.com":true,"read-books.org":true,"securitytactics.com":true,"serveexchange.com":true,"servehumour.com":true,"servep2p.com":true,"servesarcasm.com":true,"stufftoread.com":true,"ufcfan.org":true,"unusualperson.com":true,"workisboring.com":true,"3utilities.com":true,"bounceme.net":true,"ddns.net":true,"ddnsking.com":true,"gotdns.ch":true,"hopto.org":true,"myftp.biz":true,"myftp.org":true,"myvnc.com":true,"no-ip.biz":true,"no-ip.info":true,"no-ip.org":true,"noip.me":true,"redirectme.net":true,"servebeer.com":true,"serveblog.net":true,"servecounterstrike.com":true,"serveftp.com":true,"servegame.com":true,"servehalflife.com":true,"servehttp.com":true,"serveirc.com":true,"serveminecraft.net":true,"servemp3.com":true,"servepics.com":true,"servequake.com":true,"sytes.net":true,"webhop.me":true,"zapto.org":true,"stage.nodeart.io":true,"nodum.co":true,"nodum.io":true,"nyc.mn":true,"nom.ae":true,"nom.ai":true,"nom.al":true,"nym.by":true,"nym.bz":true,"nom.cl":true,"nom.gd":true,"nom.gl":true,"nym.gr":true,"nom.gt":true,"nom.hn":true,"nom.im":true,"nym.kz":true,"nym.la":true,"nom.li":true,"nym.li":true,"nym.lt":true,"nym.lu":true,"nym.me":true,"nom.mk":true,"nym.mx":true,"nom.nu":true,"nym.nz":true,"nym.pe":true,"nym.pt":true,"nom.pw":true,"nom.qa":true,"nom.rs":true,"nom.si":true,"nym.sk":true,"nym.su":true,"nym.sx":true,"nym.tw":true,"nom.ug":true,"nom.uy":true,"nom.vc":true,"nom.vg":true,"cya.gg":true,"nid.io":true,"opencraft.hosting":true,"operaunite.com":true,"outsystemscloud.com":true,"ownprovider.com":true,"oy.lc":true,"pgfog.com":true,"pagefrontapp.com":true,"art.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"pantheonsite.io":true,"gotpantheon.com":true,"mypep.link":true,"on-web.fr":true,"*.platform.sh":true,"*.platformsh.site":true,"xen.prgmr.com":true,"priv.at":true,"protonet.io":true,"chirurgiens-dentistes-en-france.fr":true,"byen.site":true,"qa2.com":true,"dev-myqnapcloud.com":true,"alpha-myqnapcloud.com":true,"myqnapcloud.com":true,"*.quipelements.com":true,"vapor.cloud":true,"vaporcloud.io":true,"rackmaze.com":true,"rackmaze.net":true,"rhcloud.com":true,"resindevice.io":true,"devices.resinstaging.io":true,"hzc.io":true,"wellbeingzone.eu":true,"ptplus.fit":true,"wellbeingzone.co.uk":true,"sandcats.io":true,"logoip.de":true,"logoip.com":true,"schokokeks.net":true,"scrysec.com":true,"firewall-gateway.com":true,"firewall-gateway.de":true,"my-gateway.de":true,"my-router.de":true,"spdns.de":true,"spdns.eu":true,"firewall-gateway.net":true,"my-firewall.org":true,"myfirewall.org":true,"spdns.org":true,"*.s5y.io":true,"*.sensiosite.cloud":true,"biz.ua":true,"co.ua":true,"pp.ua":true,"shiftedit.io":true,"myshopblocks.com":true,"1kapp.com":true,"appchizi.com":true,"applinzi.com":true,"sinaapp.com":true,"vipsinaapp.com":true,"bounty-full.com":true,"alpha.bounty-full.com":true,"beta.bounty-full.com":true,"static.land":true,"dev.static.land":true,"sites.static.land":true,"apps.lair.io":true,"*.stolos.io":true,"spacekit.io":true,"stackspace.space":true,"storj.farm":true,"temp-dns.com":true,"diskstation.me":true,"dscloud.biz":true,"dscloud.me":true,"dscloud.mobi":true,"dsmynas.com":true,"dsmynas.net":true,"dsmynas.org":true,"familyds.com":true,"familyds.net":true,"familyds.org":true,"i234.me":true,"myds.me":true,"synology.me":true,"vpnplus.to":true,"taifun-dns.de":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"cust.dev.thingdust.io":true,"cust.disrec.thingdust.io":true,"cust.prod.thingdust.io":true,"cust.testing.thingdust.io":true,"bloxcms.com":true,"townnews-staging.com":true,"12hp.at":true,"2ix.at":true,"4lima.at":true,"lima-city.at":true,"12hp.ch":true,"2ix.ch":true,"4lima.ch":true,"lima-city.ch":true,"trafficplex.cloud":true,"de.cool":true,"12hp.de":true,"2ix.de":true,"4lima.de":true,"lima-city.de":true,"1337.pictures":true,"clan.rip":true,"lima-city.rocks":true,"webspace.rocks":true,"lima.zone":true,"*.transurl.be":true,"*.transurl.eu":true,"*.transurl.nl":true,"tuxfamily.org":true,"dd-dns.de":true,"diskstation.eu":true,"diskstation.org":true,"dray-dns.de":true,"draydns.de":true,"dyn-vpn.de":true,"dynvpn.de":true,"mein-vigor.de":true,"my-vigor.de":true,"my-wan.de":true,"syno-ds.de":true,"synology-diskstation.de":true,"synology-ds.de":true,"uber.space":true,"hk.com":true,"hk.org":true,"ltd.hk":true,"inc.hk":true,"lib.de.us":true,"2038.io":true,"router.management":true,"v-info.info":true,"wedeploy.io":true,"wedeploy.me":true,"wedeploy.sh":true,"remotewd.com":true,"wmflabs.org":true,"cistron.nl":true,"demon.nl":true,"xs4all.space":true,"official.academy":true,"yolasite.com":true,"ybo.faith":true,"yombo.me":true,"homelink.one":true,"ybo.party":true,"ybo.review":true,"ybo.science":true,"ybo.trade":true,"za.net":true,"za.org":true,"now.sh":true}); - -// END of automatically generated file - -},{"punycode":undefined}],175:[function(require,module,exports){ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of Salesforce.com nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -'use strict'; -/*jshint unused:false */ - -function Store() { -} -exports.Store = Store; - -// Stores may be synchronous, but are still required to use a -// Continuation-Passing Style API. The CookieJar itself will expose a "*Sync" -// API that converts from synchronous-callbacks to imperative style. -Store.prototype.synchronous = false; - -Store.prototype.findCookie = function(domain, path, key, cb) { - throw new Error('findCookie is not implemented'); -}; - -Store.prototype.findCookies = function(domain, path, cb) { - throw new Error('findCookies is not implemented'); -}; - -Store.prototype.putCookie = function(cookie, cb) { - throw new Error('putCookie is not implemented'); -}; - -Store.prototype.updateCookie = function(oldCookie, newCookie, cb) { - // recommended default implementation: - // return this.putCookie(newCookie, cb); - throw new Error('updateCookie is not implemented'); -}; - -Store.prototype.removeCookie = function(domain, path, key, cb) { - throw new Error('removeCookie is not implemented'); -}; - -Store.prototype.removeCookies = function(domain, path, cb) { - throw new Error('removeCookies is not implemented'); -}; - -Store.prototype.getAllCookies = function(cb) { - throw new Error('getAllCookies is not implemented (therefore jar cannot be serialized)'); -}; - -},{}],176:[function(require,module,exports){ -module.exports={ - "_args": [ - [ - "tough-cookie@2.3.4", - "/Users/krcrane/src/ibm/starter-kit-service-deployer" - ] - ], - "_from": "tough-cookie@2.3.4", - "_id": "tough-cookie@2.3.4", - "_inBundle": false, - "_integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "_location": "/request/tough-cookie", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "tough-cookie@2.3.4", - "name": "tough-cookie", - "escapedName": "tough-cookie", - "rawSpec": "2.3.4", - "saveSpec": null, - "fetchSpec": "2.3.4" - }, - "_requiredBy": [ - "/request" - ], - "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "_spec": "2.3.4", - "_where": "/Users/krcrane/src/ibm/starter-kit-service-deployer", - "author": { - "name": "Jeremy Stashewsky", - "email": "jstashewsky@salesforce.com" - }, - "bugs": { - "url": "https://github.com/salesforce/tough-cookie/issues" - }, - "contributors": [ - { - "name": "Alexander Savin" - }, - { - "name": "Ian Livingstone" - }, - { - "name": "Ivan Nikulin" - }, - { - "name": "Lalit Kapoor" - }, - { - "name": "Sam Thompson" - }, - { - "name": "Sebastian Mayr" - } - ], - "dependencies": { - "punycode": "^1.4.1" - }, - "description": "RFC6265 Cookies and Cookie Jar for node.js", - "devDependencies": { - "async": "^1.4.2", - "string.prototype.repeat": "^0.2.0", - "vows": "^0.8.1" - }, - "engines": { - "node": ">=0.8" - }, - "files": [ - "lib" - ], - "homepage": "https://github.com/salesforce/tough-cookie", - "keywords": [ - "HTTP", - "cookie", - "cookies", - "set-cookie", - "cookiejar", - "jar", - "RFC6265", - "RFC2965" - ], - "license": "BSD-3-Clause", - "main": "./lib/cookie", - "name": "tough-cookie", - "repository": { - "type": "git", - "url": "git://github.com/salesforce/tough-cookie.git" - }, - "scripts": { - "suffixup": "curl -o public_suffix_list.dat https://publicsuffix.org/list/public_suffix_list.dat && ./generate-pubsuffix.js", - "test": "vows test/*_test.js" - }, - "version": "2.3.4" -} - -},{}],177:[function(require,module,exports){ -'use strict' - -var net = require('net') - , tls = require('tls') - , http = require('http') - , https = require('https') - , events = require('events') - , assert = require('assert') - , util = require('util') - , Buffer = require('safe-buffer').Buffer - ; - -exports.httpOverHttp = httpOverHttp -exports.httpsOverHttp = httpsOverHttp -exports.httpOverHttps = httpOverHttps -exports.httpsOverHttps = httpsOverHttps - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - return agent -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - agent.createSocket = createSecureSocket - agent.defaultPort = 443 - return agent -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - return agent -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - agent.createSocket = createSecureSocket - agent.defaultPort = 443 - return agent -} - - -function TunnelingAgent(options) { - var self = this - self.options = options || {} - self.proxyOptions = self.options.proxy || {} - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets - self.requests = [] - self.sockets = [] - - self.on('free', function onFree(socket, host, port) { - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i] - if (pending.host === host && pending.port === port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1) - pending.request.onSocket(socket) - return - } - } - socket.destroy() - self.removeSocket(socket) - }) -} -util.inherits(TunnelingAgent, events.EventEmitter) - -TunnelingAgent.prototype.addRequest = function addRequest(req, options) { - var self = this - - // Legacy API: addRequest(req, host, port, path) - if (typeof options === 'string') { - options = { - host: options, - port: arguments[2], - path: arguments[3] - }; - } - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push({host: options.host, port: options.port, request: req}) - return - } - - // If we are under maxSockets create a new one. - self.createConnection({host: options.host, port: options.port, request: req}) -} - -TunnelingAgent.prototype.createConnection = function createConnection(pending) { - var self = this - - self.createSocket(pending, function(socket) { - socket.on('free', onFree) - socket.on('close', onCloseOrRemove) - socket.on('agentRemove', onCloseOrRemove) - pending.request.onSocket(socket) - - function onFree() { - self.emit('free', socket, pending.host, pending.port) - } - - function onCloseOrRemove(err) { - self.removeSocket(socket) - socket.removeListener('free', onFree) - socket.removeListener('close', onCloseOrRemove) - socket.removeListener('agentRemove', onCloseOrRemove) - } - }) -} - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this - var placeholder = {} - self.sockets.push(placeholder) - - var connectOptions = mergeOptions({}, self.proxyOptions, - { method: 'CONNECT' - , path: options.host + ':' + options.port - , agent: false - } - ) - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {} - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - Buffer.from(connectOptions.proxyAuth).toString('base64') - } - - debug('making CONNECT request') - var connectReq = self.request(connectOptions) - connectReq.useChunkedEncodingByDefault = false // for v0.6 - connectReq.once('response', onResponse) // for v0.6 - connectReq.once('upgrade', onUpgrade) // for v0.6 - connectReq.once('connect', onConnect) // for v0.7 or later - connectReq.once('error', onError) - connectReq.end() - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head) - }) - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners() - socket.removeAllListeners() - - if (res.statusCode === 200) { - assert.equal(head.length, 0) - debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket - cb(socket) - } else { - debug('tunneling socket could not be established, statusCode=%d', res.statusCode) - var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } - } - - function onError(cause) { - connectReq.removeAllListeners() - - debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) - var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } -} - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) return - - this.sockets.splice(pos, 1) - - var pending = this.requests.shift() - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createConnection(pending) - } -} - -function createSecureSocket(options, cb) { - var self = this - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, mergeOptions({}, self.options, - { servername: options.host - , socket: socket - } - )) - self.sockets[self.sockets.indexOf(socket)] = secureSocket - cb(secureSocket) - }) -} - - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i] - if (typeof overrides === 'object') { - var keys = Object.keys(overrides) - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j] - if (overrides[k] !== undefined) { - target[k] = overrides[k] - } - } - } - } - return target -} - - -var debug -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments) - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0] - } else { - args.unshift('TUNNEL:') - } - console.error.apply(console, args) - } -} else { - debug = function() {} -} -exports.debug = debug // for test - -},{"assert":undefined,"events":undefined,"http":undefined,"https":undefined,"net":undefined,"safe-buffer":181,"tls":undefined,"util":undefined}],178:[function(require,module,exports){ -'use strict' - -var http = require('http') -var https = require('https') -var url = require('url') -var util = require('util') -var stream = require('stream') -var zlib = require('zlib') -var hawk = require('hawk') -var aws2 = require('aws-sign2') -var aws4 = require('aws4') -var httpSignature = require('http-signature') -var mime = require('mime-types') -var stringstream = require('stringstream') -var caseless = require('caseless') -var ForeverAgent = require('forever-agent') -var FormData = require('form-data') -var extend = require('extend') -var isstream = require('isstream') -var isTypedArray = require('is-typedarray').strict -var helpers = require('./lib/helpers') -var cookies = require('./lib/cookies') -var getProxyFromURI = require('./lib/getProxyFromURI') -var Querystring = require('./lib/querystring').Querystring -var Har = require('./lib/har').Har -var Auth = require('./lib/auth').Auth -var OAuth = require('./lib/oauth').OAuth -var Multipart = require('./lib/multipart').Multipart -var Redirect = require('./lib/redirect').Redirect -var Tunnel = require('./lib/tunnel').Tunnel -var now = require('performance-now') -var Buffer = require('safe-buffer').Buffer - -var safeStringify = helpers.safeStringify -var isReadStream = helpers.isReadStream -var toBase64 = helpers.toBase64 -var defer = helpers.defer -var copy = helpers.copy -var version = helpers.version -var globalCookieJar = cookies.jar() - -var globalPool = {} - -function filterForNonReserved (reserved, options) { - // Filter out properties that are not reserved. - // Reserved values are passed in at call site. - - var object = {} - for (var i in options) { - var notReserved = (reserved.indexOf(i) === -1) - if (notReserved) { - object[i] = options[i] - } - } - return object -} - -function filterOutReservedFunctions (reserved, options) { - // Filter out properties that are functions and are reserved. - // Reserved values are passed in at call site. - - var object = {} - for (var i in options) { - var isReserved = !(reserved.indexOf(i) === -1) - var isFunction = (typeof options[i] === 'function') - if (!(isReserved && isFunction)) { - object[i] = options[i] - } - } - return object -} - -// Return a simpler request object to allow serialization -function requestToJSON () { - var self = this - return { - uri: self.uri, - method: self.method, - headers: self.headers - } -} - -// Return a simpler response object to allow serialization -function responseToJSON () { - var self = this - return { - statusCode: self.statusCode, - body: self.body, - headers: self.headers, - request: requestToJSON.call(self.request) - } -} - -function Request (options) { - // if given the method property in options, set property explicitMethod to true - - // extend the Request instance with any non-reserved properties - // remove any reserved functions from the options object - // set Request instance to be readable and writable - // call init - - var self = this - - // start with HAR, then override with additional options - if (options.har) { - self._har = new Har(self) - options = self._har.options(options) - } - - stream.Stream.call(self) - var reserved = Object.keys(Request.prototype) - var nonReserved = filterForNonReserved(reserved, options) - - extend(self, nonReserved) - options = filterOutReservedFunctions(reserved, options) - - self.readable = true - self.writable = true - if (options.method) { - self.explicitMethod = true - } - self._qs = new Querystring(self) - self._auth = new Auth(self) - self._oauth = new OAuth(self) - self._multipart = new Multipart(self) - self._redirect = new Redirect(self) - self._tunnel = new Tunnel(self) - self.init(options) -} - -util.inherits(Request, stream.Stream) - -// Debugging -Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG) -function debug () { - if (Request.debug) { - console.error('REQUEST %s', util.format.apply(util, arguments)) - } -} -Request.prototype.debug = debug - -Request.prototype.init = function (options) { - // init() contains all the code to setup the request object. - // the actual outgoing request is not started until start() is called - // this function is called from both the constructor and on redirect. - var self = this - if (!options) { - options = {} - } - self.headers = self.headers ? copy(self.headers) : {} - - // Delete headers with value undefined since they break - // ClientRequest.OutgoingMessage.setHeader in node 0.12 - for (var headerName in self.headers) { - if (typeof self.headers[headerName] === 'undefined') { - delete self.headers[headerName] - } - } - - caseless.httpify(self, self.headers) - - if (!self.method) { - self.method = options.method || 'GET' - } - if (!self.localAddress) { - self.localAddress = options.localAddress - } - - self._qs.init(options) - - debug(options) - if (!self.pool && self.pool !== false) { - self.pool = globalPool - } - self.dests = self.dests || [] - self.__isRequestRequest = true - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) { - return // Print a warning maybe? - } - self._callbackCalled = true - self._callback.apply(self, arguments) - } - self.on('error', self.callback.bind()) - self.on('complete', self.callback.bind(self, null)) - } - - // People use this property instead all the time, so support it - if (!self.uri && self.url) { - self.uri = self.url - delete self.url - } - - // If there's a baseUrl, then use it as the base URL (i.e. uri must be - // specified as a relative path and is appended to baseUrl). - if (self.baseUrl) { - if (typeof self.baseUrl !== 'string') { - return self.emit('error', new Error('options.baseUrl must be a string')) - } - - if (typeof self.uri !== 'string') { - return self.emit('error', new Error('options.uri must be a string when using options.baseUrl')) - } - - if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) { - return self.emit('error', new Error('options.uri must be a path when using options.baseUrl')) - } - - // Handle all cases to make sure that there's only one slash between - // baseUrl and uri. - var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1 - var uriStartsWithSlash = self.uri.indexOf('/') === 0 - - if (baseUrlEndsWithSlash && uriStartsWithSlash) { - self.uri = self.baseUrl + self.uri.slice(1) - } else if (baseUrlEndsWithSlash || uriStartsWithSlash) { - self.uri = self.baseUrl + self.uri - } else if (self.uri === '') { - self.uri = self.baseUrl - } else { - self.uri = self.baseUrl + '/' + self.uri - } - delete self.baseUrl - } - - // A URI is needed by this point, emit error if we haven't been able to get one - if (!self.uri) { - return self.emit('error', new Error('options.uri is a required argument')) - } - - // If a string URI/URL was given, parse it into a URL object - if (typeof self.uri === 'string') { - self.uri = url.parse(self.uri) - } - - // Some URL objects are not from a URL parsed string and need href added - if (!self.uri.href) { - self.uri.href = url.format(self.uri) - } - - // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme - if (self.uri.protocol === 'unix:') { - return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`')) - } - - // Support Unix Sockets - if (self.uri.host === 'unix') { - self.enableUnixSocket() - } - - if (self.strictSSL === false) { - self.rejectUnauthorized = false - } - - if (!self.uri.pathname) { self.uri.pathname = '/' } - - if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) { - // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar - // Detect and reject it as soon as possible - var faultyUri = url.format(self.uri) - var message = 'Invalid URI "' + faultyUri + '"' - if (Object.keys(options).length === 0) { - // No option ? This can be the sign of a redirect - // As this is a case where the user cannot do anything (they didn't call request directly with this URL) - // they should be warned that it can be caused by a redirection (can save some hair) - message += '. This can be caused by a crappy redirection.' - } - // This error was fatal - self.abort() - return self.emit('error', new Error(message)) - } - - if (!self.hasOwnProperty('proxy')) { - self.proxy = getProxyFromURI(self.uri) - } - - self.tunnel = self._tunnel.isEnabled() - if (self.proxy) { - self._tunnel.setup(options) - } - - self._redirect.onRequest(options) - - self.setHost = false - if (!self.hasHeader('host')) { - var hostHeaderName = self.originalHostHeaderName || 'host' - // When used with an IPv6 address, `host` will provide - // the correct bracketed format, unlike using `hostname` and - // optionally adding the `port` when necessary. - self.setHeader(hostHeaderName, self.uri.host) - self.setHost = true - } - - self.jar(self._jar || options.jar) - - if (!self.uri.port) { - if (self.uri.protocol === 'http:') { self.uri.port = 80 } else if (self.uri.protocol === 'https:') { self.uri.port = 443 } - } - - if (self.proxy && !self.tunnel) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - if (options.form) { - self.form(options.form) - } - - if (options.formData) { - var formData = options.formData - var requestForm = self.form() - var appendFormValue = function (key, value) { - if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) { - requestForm.append(key, value.value, value.options) - } else { - requestForm.append(key, value) - } - } - for (var formKey in formData) { - if (formData.hasOwnProperty(formKey)) { - var formValue = formData[formKey] - if (formValue instanceof Array) { - for (var j = 0; j < formValue.length; j++) { - appendFormValue(formKey, formValue[j]) - } - } else { - appendFormValue(formKey, formValue) - } - } - } - } - - if (options.qs) { - self.qs(options.qs) - } - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || '') - } - - if (self.path.length === 0) { - self.path = '/' - } - - // Auth must happen last in case signing is dependent on other headers - if (options.aws) { - self.aws(options.aws) - } - - if (options.hawk) { - self.hawk(options.hawk) - } - - if (options.httpSignature) { - self.httpSignature(options.httpSignature) - } - - if (options.auth) { - if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) { - options.auth.user = options.auth.username - } - if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) { - options.auth.pass = options.auth.password - } - - self.auth( - options.auth.user, - options.auth.pass, - options.auth.sendImmediately, - options.auth.bearer - ) - } - - if (self.gzip && !self.hasHeader('accept-encoding')) { - self.setHeader('accept-encoding', 'gzip, deflate') - } - - if (self.uri.auth && !self.hasHeader('authorization')) { - var uriAuthPieces = self.uri.auth.split(':').map(function (item) { return self._qs.unescape(item) }) - self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true) - } - - if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) { - var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) { return self._qs.unescape(item) }) - var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) - self.setHeader('proxy-authorization', authHeader) - } - - if (self.proxy && !self.tunnel) { - self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - } - - if (options.json) { - self.json(options.json) - } - if (options.multipart) { - self.multipart(options.multipart) - } - - if (options.time) { - self.timing = true - - // NOTE: elapsedTime is deprecated in favor of .timings - self.elapsedTime = self.elapsedTime || 0 - } - - function setContentLength () { - if (isTypedArray(self.body)) { - self.body = Buffer.from(self.body) - } - - if (!self.hasHeader('content-length')) { - var length - if (typeof self.body === 'string') { - length = Buffer.byteLength(self.body) - } else if (Array.isArray(self.body)) { - length = self.body.reduce(function (a, b) { return a + b.length }, 0) - } else { - length = self.body.length - } - - if (length) { - self.setHeader('content-length', length) - } else { - self.emit('error', new Error('Argument error, options.body.')) - } - } - } - if (self.body && !isstream(self.body)) { - setContentLength() - } - - if (options.oauth) { - self.oauth(options.oauth) - } else if (self._oauth.params && self.hasHeader('authorization')) { - self.oauth(self._oauth.params) - } - - var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol - var defaultModules = {'http:': http, 'https:': https} - var httpModules = self.httpModules || {} - - self.httpModule = httpModules[protocol] || defaultModules[protocol] - - if (!self.httpModule) { - return self.emit('error', new Error('Invalid protocol: ' + protocol)) - } - - if (options.ca) { - self.ca = options.ca - } - - if (!self.agent) { - if (options.agentOptions) { - self.agentOptions = options.agentOptions - } - - if (options.agentClass) { - self.agentClass = options.agentClass - } else if (options.forever) { - var v = version() - // use ForeverAgent in node 0.10- only - if (v.major === 0 && v.minor <= 10) { - self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL - } else { - self.agentClass = self.httpModule.Agent - self.agentOptions = self.agentOptions || {} - self.agentOptions.keepAlive = true - } - } else { - self.agentClass = self.httpModule.Agent - } - } - - if (self.pool === false) { - self.agent = false - } else { - self.agent = self.agent || self.getNewAgent() - } - - self.on('pipe', function (src) { - if (self.ntick && self._started) { - self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.')) - } - self.src = src - if (isReadStream(src)) { - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', mime.lookup(src.path)) - } - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.hasHeader(i)) { - self.setHeader(i, src.headers[i]) - } - } - } - if (self._json && !self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - if (src.method && !self.explicitMethod) { - self.method = src.method - } - } - - // self.on('pipe', function () { - // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.') - // }) - }) - - defer(function () { - if (self._aborted) { - return - } - - var end = function () { - if (self._form) { - if (!self._auth.hasAuth) { - self._form.pipe(self) - } else if (self._auth.hasAuth && self._auth.sentAuth) { - self._form.pipe(self) - } - } - if (self._multipart && self._multipart.chunked) { - self._multipart.body.pipe(self) - } - if (self.body) { - if (isstream(self.body)) { - self.body.pipe(self) - } else { - setContentLength() - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } - self.end() - } - } else if (self.requestBodyStream) { - console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.') - self.requestBodyStream.pipe(self) - } else if (!self.src) { - if (self._auth.hasAuth && !self._auth.sentAuth) { - self.end() - return - } - if (self.method !== 'GET' && typeof self.method !== 'undefined') { - self.setHeader('content-length', 0) - } - self.end() - } - } - - if (self._form && !self.hasHeader('content-length')) { - // Before ending the request, we had to compute the length of the whole form, asyncly - self.setHeader(self._form.getHeaders(), true) - self._form.getLength(function (err, length) { - if (!err && !isNaN(length)) { - self.setHeader('content-length', length) - } - end() - }) - } else { - end() - } - - self.ntick = true - }) -} - -Request.prototype.getNewAgent = function () { - var self = this - var Agent = self.agentClass - var options = {} - if (self.agentOptions) { - for (var i in self.agentOptions) { - options[i] = self.agentOptions[i] - } - } - if (self.ca) { - options.ca = self.ca - } - if (self.ciphers) { - options.ciphers = self.ciphers - } - if (self.secureProtocol) { - options.secureProtocol = self.secureProtocol - } - if (self.secureOptions) { - options.secureOptions = self.secureOptions - } - if (typeof self.rejectUnauthorized !== 'undefined') { - options.rejectUnauthorized = self.rejectUnauthorized - } - - if (self.cert && self.key) { - options.key = self.key - options.cert = self.cert - } - - if (self.pfx) { - options.pfx = self.pfx - } - - if (self.passphrase) { - options.passphrase = self.passphrase - } - - var poolKey = '' - - // different types of agents are in different pools - if (Agent !== self.httpModule.Agent) { - poolKey += Agent.name - } - - // ca option is only relevant if proxy or destination are https - var proxy = self.proxy - if (typeof proxy === 'string') { - proxy = url.parse(proxy) - } - var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' - - if (isHttps) { - if (options.ca) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.ca - } - - if (typeof options.rejectUnauthorized !== 'undefined') { - if (poolKey) { - poolKey += ':' - } - poolKey += options.rejectUnauthorized - } - - if (options.cert) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.cert.toString('ascii') + options.key.toString('ascii') - } - - if (options.pfx) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.pfx.toString('ascii') - } - - if (options.ciphers) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.ciphers - } - - if (options.secureProtocol) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.secureProtocol - } - - if (options.secureOptions) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.secureOptions - } - } - - if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) { - // not doing anything special. Use the globalAgent - return self.httpModule.globalAgent - } - - // we're using a stored agent. Make sure it's protocol-specific - poolKey = self.uri.protocol + poolKey - - // generate a new agent for this setting if none yet exists - if (!self.pool[poolKey]) { - self.pool[poolKey] = new Agent(options) - // properly set maxSockets on new agents - if (self.pool.maxSockets) { - self.pool[poolKey].maxSockets = self.pool.maxSockets - } - } - - return self.pool[poolKey] -} - -Request.prototype.start = function () { - // start() is called once we are ready to send the outgoing HTTP request. - // this is usually called on the first write(), end() or on nextTick() - var self = this - - if (self.timing) { - // All timings will be relative to this request's startTime. In order to do this, - // we need to capture the wall-clock start time (via Date), immediately followed - // by the high-resolution timer (via now()). While these two won't be set - // at the _exact_ same time, they should be close enough to be able to calculate - // high-resolution, monotonically non-decreasing timestamps relative to startTime. - var startTime = new Date().getTime() - var startTimeNow = now() - } - - if (self._aborted) { - return - } - - self._started = true - self.method = self.method || 'GET' - self.href = self.uri.href - - if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { - self.setHeader('content-length', self.src.stat.size) - } - if (self._aws) { - self.aws(self._aws, true) - } - - // We have a method named auth, which is completely different from the http.request - // auth option. If we don't remove it, we're gonna have a bad time. - var reqOptions = copy(self) - delete reqOptions.auth - - debug('make request', self.uri.href) - - // node v6.8.0 now supports a `timeout` value in `http.request()`, but we - // should delete it for now since we handle timeouts manually for better - // consistency with node versions before v6.8.0 - delete reqOptions.timeout - - try { - self.req = self.httpModule.request(reqOptions) - } catch (err) { - self.emit('error', err) - return - } - - if (self.timing) { - self.startTime = startTime - self.startTimeNow = startTimeNow - - // Timing values will all be relative to startTime (by comparing to startTimeNow - // so we have an accurate clock) - self.timings = {} - } - - var timeout - if (self.timeout && !self.timeoutTimer) { - if (self.timeout < 0) { - timeout = 0 - } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) { - timeout = self.timeout - } - } - - self.req.on('response', self.onRequestResponse.bind(self)) - self.req.on('error', self.onRequestError.bind(self)) - self.req.on('drain', function () { - self.emit('drain') - }) - - self.req.on('socket', function (socket) { - // `._connecting` was the old property which was made public in node v6.1.0 - var isConnecting = socket._connecting || socket.connecting - if (self.timing) { - self.timings.socket = now() - self.startTimeNow - - if (isConnecting) { - var onLookupTiming = function () { - self.timings.lookup = now() - self.startTimeNow - } - - var onConnectTiming = function () { - self.timings.connect = now() - self.startTimeNow - } - - socket.once('lookup', onLookupTiming) - socket.once('connect', onConnectTiming) - - // clean up timing event listeners if needed on error - self.req.once('error', function () { - socket.removeListener('lookup', onLookupTiming) - socket.removeListener('connect', onConnectTiming) - }) - } - } - - var setReqTimeout = function () { - // This timeout sets the amount of time to wait *between* bytes sent - // from the server once connected. - // - // In particular, it's useful for erroring if the server fails to send - // data halfway through streaming a response. - self.req.setTimeout(timeout, function () { - if (self.req) { - self.abort() - var e = new Error('ESOCKETTIMEDOUT') - e.code = 'ESOCKETTIMEDOUT' - e.connect = false - self.emit('error', e) - } - }) - } - if (timeout !== undefined) { - // Only start the connection timer if we're actually connecting a new - // socket, otherwise if we're already connected (because this is a - // keep-alive connection) do not bother. This is important since we won't - // get a 'connect' event for an already connected socket. - if (isConnecting) { - var onReqSockConnect = function () { - socket.removeListener('connect', onReqSockConnect) - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - setReqTimeout() - } - - socket.on('connect', onReqSockConnect) - - self.req.on('error', function (err) { // eslint-disable-line handle-callback-err - socket.removeListener('connect', onReqSockConnect) - }) - - // Set a timeout in memory - this block will throw if the server takes more - // than `timeout` to write the HTTP status and headers (corresponding to - // the on('response') event on the client). NB: this measures wall-clock - // time, not the time between bytes sent by the server. - self.timeoutTimer = setTimeout(function () { - socket.removeListener('connect', onReqSockConnect) - self.abort() - var e = new Error('ETIMEDOUT') - e.code = 'ETIMEDOUT' - e.connect = true - self.emit('error', e) - }, timeout) - } else { - // We're already connected - setReqTimeout() - } - } - self.emit('socket', socket) - }) - - self.emit('request', self.req) -} - -Request.prototype.onRequestError = function (error) { - var self = this - if (self._aborted) { - return - } - if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' && - self.agent.addRequestNoreuse) { - self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } - self.start() - self.req.end() - return - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - self.emit('error', error) -} - -Request.prototype.onRequestResponse = function (response) { - var self = this - - if (self.timing) { - self.timings.response = now() - self.startTimeNow - } - - debug('onRequestResponse', self.uri.href, response.statusCode, response.headers) - response.on('end', function () { - if (self.timing) { - self.timings.end = now() - self.startTimeNow - response.timingStart = self.startTime - - // fill in the blanks for any periods that didn't trigger, such as - // no lookup or connect due to keep alive - if (!self.timings.socket) { - self.timings.socket = 0 - } - if (!self.timings.lookup) { - self.timings.lookup = self.timings.socket - } - if (!self.timings.connect) { - self.timings.connect = self.timings.lookup - } - if (!self.timings.response) { - self.timings.response = self.timings.connect - } - - debug('elapsed time', self.timings.end) - - // elapsedTime includes all redirects - self.elapsedTime += Math.round(self.timings.end) - - // NOTE: elapsedTime is deprecated in favor of .timings - response.elapsedTime = self.elapsedTime - - // timings is just for the final fetch - response.timings = self.timings - - // pre-calculate phase timings as well - response.timingPhases = { - wait: self.timings.socket, - dns: self.timings.lookup - self.timings.socket, - tcp: self.timings.connect - self.timings.lookup, - firstByte: self.timings.response - self.timings.connect, - download: self.timings.end - self.timings.response, - total: self.timings.end - } - } - debug('response end', self.uri.href, response.statusCode, response.headers) - }) - - if (self._aborted) { - debug('aborted', self.uri.href) - response.resume() - return - } - - self.response = response - response.request = self - response.toJSON = responseToJSON - - // XXX This is different on 0.10, because SSL is strict by default - if (self.httpModule === https && - self.strictSSL && (!response.hasOwnProperty('socket') || - !response.socket.authorized)) { - debug('strict ssl error', self.uri.href) - var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL' - self.emit('error', new Error('SSL Error: ' + sslErr)) - return - } - - // Save the original host before any redirect (if it changes, we need to - // remove any authorization headers). Also remember the case of the header - // name because lots of broken servers expect Host instead of host and we - // want the caller to be able to specify this. - self.originalHost = self.getHeader('host') - if (!self.originalHostHeaderName) { - self.originalHostHeaderName = self.hasHeader('host') - } - if (self.setHost) { - self.removeHeader('host') - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - - var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar - var addCookie = function (cookie) { - // set the cookie if it's domain in the href's domain. - try { - targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true}) - } catch (e) { - self.emit('error', e) - } - } - - response.caseless = caseless(response.headers) - - if (response.caseless.has('set-cookie') && (!self._disableCookies)) { - var headerName = response.caseless.has('set-cookie') - if (Array.isArray(response.headers[headerName])) { - response.headers[headerName].forEach(addCookie) - } else { - addCookie(response.headers[headerName]) - } - } - - if (self._redirect.onResponse(response)) { - return // Ignore the rest of the response - } else { - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) { - self.response.emit('end') - } - }) - - response.once('end', function () { - self._ended = true - }) - - var noBody = function (code) { - return ( - self.method === 'HEAD' || - // Informational - (code >= 100 && code < 200) || - // No Content - code === 204 || - // Not Modified - code === 304 - ) - } - - var responseContent - if (self.gzip && !noBody(response.statusCode)) { - var contentEncoding = response.headers['content-encoding'] || 'identity' - contentEncoding = contentEncoding.trim().toLowerCase() - - // Be more lenient with decoding compressed responses, since (very rarely) - // servers send slightly invalid gzip responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - var zlibOptions = { - flush: zlib.Z_SYNC_FLUSH, - finishFlush: zlib.Z_SYNC_FLUSH - } - - if (contentEncoding === 'gzip') { - responseContent = zlib.createGunzip(zlibOptions) - response.pipe(responseContent) - } else if (contentEncoding === 'deflate') { - responseContent = zlib.createInflate(zlibOptions) - response.pipe(responseContent) - } else { - // Since previous versions didn't check for Content-Encoding header, - // ignore any invalid values to preserve backwards-compatibility - if (contentEncoding !== 'identity') { - debug('ignoring unrecognized Content-Encoding ' + contentEncoding) - } - responseContent = response - } - } else { - responseContent = response - } - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.') - } else if (responseContent.setEncoding) { - responseContent.setEncoding(self.encoding) - } else { - // Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with - // zlib streams. - // If/When support for 0.9.4 is dropped, this should be unnecessary. - responseContent = responseContent.pipe(stringstream(self.encoding)) - } - } - - if (self._paused) { - responseContent.pause() - } - - self.responseContent = responseContent - - self.emit('response', response) - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - responseContent.on('data', function (chunk) { - if (self.timing && !self.responseStarted) { - self.responseStartTime = (new Date()).getTime() - - // NOTE: responseStartTime is deprecated in favor of .timings - response.responseStartTime = self.responseStartTime - } - self._destdata = true - self.emit('data', chunk) - }) - responseContent.once('end', function (chunk) { - self.emit('end', chunk) - }) - responseContent.on('error', function (error) { - self.emit('error', error) - }) - responseContent.on('close', function () { self.emit('close') }) - - if (self.callback) { - self.readResponseBody(response) - } else { // if no callback - self.on('end', function () { - if (self._aborted) { - debug('aborted', self.uri.href) - return - } - self.emit('complete', response) - }) - } - } - debug('finish init function', self.uri.href) -} - -Request.prototype.readResponseBody = function (response) { - var self = this - debug("reading response's body") - var buffers = [] - var bufferLength = 0 - var strings = [] - - self.on('data', function (chunk) { - if (!Buffer.isBuffer(chunk)) { - strings.push(chunk) - } else if (chunk.length) { - bufferLength += chunk.length - buffers.push(chunk) - } - }) - self.on('end', function () { - debug('end event', self.uri.href) - if (self._aborted) { - debug('aborted', self.uri.href) - // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request. - // This can lead to leaky behavior if the user retains a reference to the request object. - buffers = [] - bufferLength = 0 - return - } - - if (bufferLength) { - debug('has body', self.uri.href, bufferLength) - response.body = Buffer.concat(buffers, bufferLength) - if (self.encoding !== null) { - response.body = response.body.toString(self.encoding) - } - // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request. - // This can lead to leaky behavior if the user retains a reference to the request object. - buffers = [] - bufferLength = 0 - } else if (strings.length) { - // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. - // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). - if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') { - strings[0] = strings[0].substring(1) - } - response.body = strings.join('') - } - - if (self._json) { - try { - response.body = JSON.parse(response.body, self._jsonReviver) - } catch (e) { - debug('invalid JSON received', self.uri.href) - } - } - debug('emitting complete', self.uri.href) - if (typeof response.body === 'undefined' && !self._json) { - response.body = self.encoding === null ? Buffer.alloc(0) : '' - } - self.emit('complete', response, response.body) - }) -} - -Request.prototype.abort = function () { - var self = this - self._aborted = true - - if (self.req) { - self.req.abort() - } else if (self.response) { - self.response.destroy() - } - - self.emit('abort') -} - -Request.prototype.pipeDest = function (dest) { - var self = this - var response = self.response - // Called after the response is received - if (dest.headers && !dest.headersSent) { - if (response.caseless.has('content-type')) { - var ctname = response.caseless.has('content-type') - if (dest.setHeader) { - dest.setHeader(ctname, response.headers[ctname]) - } else { - dest.headers[ctname] = response.headers[ctname] - } - } - - if (response.caseless.has('content-length')) { - var clname = response.caseless.has('content-length') - if (dest.setHeader) { - dest.setHeader(clname, response.headers[clname]) - } else { - dest.headers[clname] = response.headers[clname] - } - } - } - if (dest.setHeader && !dest.headersSent) { - for (var i in response.headers) { - // If the response content is being decoded, the Content-Encoding header - // of the response doesn't represent the piped content, so don't pass it. - if (!self.gzip || i !== 'content-encoding') { - dest.setHeader(i, response.headers[i]) - } - } - dest.statusCode = response.statusCode - } - if (self.pipefilter) { - self.pipefilter(response, dest) - } -} - -Request.prototype.qs = function (q, clobber) { - var self = this - var base - if (!clobber && self.uri.query) { - base = self._qs.parse(self.uri.query) - } else { - base = {} - } - - for (var i in q) { - base[i] = q[i] - } - - var qs = self._qs.stringify(base) - - if (qs === '') { - return self - } - - self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs) - self.url = self.uri - self.path = self.uri.path - - if (self.uri.host === 'unix') { - self.enableUnixSocket() - } - - return self -} -Request.prototype.form = function (form) { - var self = this - if (form) { - if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { - self.setHeader('content-type', 'application/x-www-form-urlencoded') - } - self.body = (typeof form === 'string') - ? self._qs.rfc3986(form.toString('utf8')) - : self._qs.stringify(form).toString('utf8') - return self - } - // create form-data object - self._form = new FormData() - self._form.on('error', function (err) { - err.message = 'form-data: ' + err.message - self.emit('error', err) - self.abort() - }) - return self._form -} -Request.prototype.multipart = function (multipart) { - var self = this - - self._multipart.onRequest(multipart) - - if (!self._multipart.chunked) { - self.body = self._multipart.body - } - - return self -} -Request.prototype.json = function (val) { - var self = this - - if (!self.hasHeader('accept')) { - self.setHeader('accept', 'application/json') - } - - if (typeof self.jsonReplacer === 'function') { - self._jsonReplacer = self.jsonReplacer - } - - self._json = true - if (typeof val === 'boolean') { - if (self.body !== undefined) { - if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { - self.body = safeStringify(self.body, self._jsonReplacer) - } else { - self.body = self._qs.rfc3986(self.body) - } - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - } - } else { - self.body = safeStringify(val, self._jsonReplacer) - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - } - - if (typeof self.jsonReviver === 'function') { - self._jsonReviver = self.jsonReviver - } - - return self -} -Request.prototype.getHeader = function (name, headers) { - var self = this - var result, re, match - if (!headers) { - headers = self.headers - } - Object.keys(headers).forEach(function (key) { - if (key.length !== name.length) { - return - } - re = new RegExp(name, 'i') - match = key.match(re) - if (match) { - result = headers[key] - } - }) - return result -} -Request.prototype.enableUnixSocket = function () { - // Get the socket & request paths from the URL - var unixParts = this.uri.path.split(':') - var host = unixParts[0] - var path = unixParts[1] - // Apply unix properties to request - this.socketPath = host - this.uri.pathname = path - this.uri.path = path - this.uri.host = host - this.uri.hostname = host - this.uri.isUnix = true -} - -Request.prototype.auth = function (user, pass, sendImmediately, bearer) { - var self = this - - self._auth.onRequest(user, pass, sendImmediately, bearer) - - return self -} -Request.prototype.aws = function (opts, now) { - var self = this - - if (!now) { - self._aws = opts - return self - } - - if (opts.sign_version === 4 || opts.sign_version === '4') { - // use aws4 - var options = { - host: self.uri.host, - path: self.uri.path, - method: self.method, - headers: { - 'content-type': self.getHeader('content-type') || '' - }, - body: self.body - } - var signRes = aws4.sign(options, { - accessKeyId: opts.key, - secretAccessKey: opts.secret, - sessionToken: opts.session - }) - self.setHeader('authorization', signRes.headers.Authorization) - self.setHeader('x-amz-date', signRes.headers['X-Amz-Date']) - if (signRes.headers['X-Amz-Security-Token']) { - self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token']) - } - } else { - // default: use aws-sign2 - var date = new Date() - self.setHeader('date', date.toUTCString()) - var auth = { - key: opts.key, - secret: opts.secret, - verb: self.method.toUpperCase(), - date: date, - contentType: self.getHeader('content-type') || '', - md5: self.getHeader('content-md5') || '', - amazonHeaders: aws2.canonicalizeHeaders(self.headers) - } - var path = self.uri.path - if (opts.bucket && path) { - auth.resource = '/' + opts.bucket + path - } else if (opts.bucket && !path) { - auth.resource = '/' + opts.bucket - } else if (!opts.bucket && path) { - auth.resource = path - } else if (!opts.bucket && !path) { - auth.resource = '/' - } - auth.resource = aws2.canonicalizeResource(auth.resource) - self.setHeader('authorization', aws2.authorization(auth)) - } - - return self -} -Request.prototype.httpSignature = function (opts) { - var self = this - httpSignature.signRequest({ - getHeader: function (header) { - return self.getHeader(header, self.headers) - }, - setHeader: function (header, value) { - self.setHeader(header, value) - }, - method: self.method, - path: self.path - }, opts) - debug('httpSignature authorization', self.getHeader('authorization')) - - return self -} -Request.prototype.hawk = function (opts) { - var self = this - self.setHeader('Authorization', hawk.client.header(self.uri, self.method, opts).field) -} -Request.prototype.oauth = function (_oauth) { - var self = this - - self._oauth.onRequest(_oauth) - - return self -} - -Request.prototype.jar = function (jar) { - var self = this - var cookies - - if (self._redirect.redirectsFollowed === 0) { - self.originalCookieHeader = self.getHeader('cookie') - } - - if (!jar) { - // disable cookies - cookies = false - self._disableCookies = true - } else { - var targetCookieJar = (jar && jar.getCookieString) ? jar : globalCookieJar - var urihref = self.uri.href - // fetch cookie in the Specified host - if (targetCookieJar) { - cookies = targetCookieJar.getCookieString(urihref) - } - } - - // if need cookie and cookie is not empty - if (cookies && cookies.length) { - if (self.originalCookieHeader) { - // Don't overwrite existing Cookie header - self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies) - } else { - self.setHeader('cookie', cookies) - } - } - self._jar = jar - return self -} - -// Stream API -Request.prototype.pipe = function (dest, opts) { - var self = this - - if (self.response) { - if (self._destdata) { - self.emit('error', new Error('You cannot pipe after data has been emitted from the response.')) - } else if (self._ended) { - self.emit('error', new Error('You cannot pipe after the response has been ended.')) - } else { - stream.Stream.prototype.pipe.call(self, dest, opts) - self.pipeDest(dest) - return dest - } - } else { - self.dests.push(dest) - stream.Stream.prototype.pipe.call(self, dest, opts) - return dest - } -} -Request.prototype.write = function () { - var self = this - if (self._aborted) { return } - - if (!self._started) { - self.start() - } - if (self.req) { - return self.req.write.apply(self.req, arguments) - } -} -Request.prototype.end = function (chunk) { - var self = this - if (self._aborted) { return } - - if (chunk) { - self.write(chunk) - } - if (!self._started) { - self.start() - } - if (self.req) { - self.req.end() - } -} -Request.prototype.pause = function () { - var self = this - if (!self.responseContent) { - self._paused = true - } else { - self.responseContent.pause.apply(self.responseContent, arguments) - } -} -Request.prototype.resume = function () { - var self = this - if (!self.responseContent) { - self._paused = false - } else { - self.responseContent.resume.apply(self.responseContent, arguments) - } -} -Request.prototype.destroy = function () { - var self = this - if (!self._ended) { - self.end() - } else if (self.response) { - self.response.destroy() - } -} - -Request.defaultProxyHeaderWhiteList = - Tunnel.defaultProxyHeaderWhiteList.slice() - -Request.defaultProxyHeaderExclusiveList = - Tunnel.defaultProxyHeaderExclusiveList.slice() - -// Exports - -Request.prototype.toJSON = requestToJSON -module.exports = Request - -},{"./lib/auth":131,"./lib/cookies":132,"./lib/getProxyFromURI":133,"./lib/har":134,"./lib/helpers":135,"./lib/multipart":136,"./lib/oauth":137,"./lib/querystring":138,"./lib/redirect":139,"./lib/tunnel":140,"aws-sign2":142,"aws4":70,"caseless":144,"extend":81,"forever-agent":85,"form-data":147,"hawk":153,"http":undefined,"http-signature":159,"https":undefined,"is-typedarray":111,"isstream":112,"mime-types":121,"performance-now":123,"safe-buffer":181,"stream":undefined,"stringstream":207,"url":undefined,"util":undefined,"zlib":undefined}],179:[function(require,module,exports){ -var fs = require('fs'); -var sys = require('util') -exports.defaultBoundary = '48940923NODERESLTER3890457293'; - - -// This little object allows us hijack the write method via duck-typing -// and write to strings or regular streams that support the write method. -function Stream(stream) { - //If the user pases a string for stream,we initalize one to write to - if (this._isString(stream)) { - this.string = ""; - } - this.stream = stream; - -} - -Stream.prototype = { - //write to an internal String or to the Stream - write: function(data) { - if (this.string != undefined) { - this.string += data; - } else { - this.stream.write(data, "binary"); - } - }, - - //stolen from underscore.js - _isString: function(obj) { - return !!(obj === '' || (obj && obj.charCodeAt && obj.substr)); - } -} - -function File(path, filename, fileSize, encoding, contentType) { - this.path = path; - this.filename = filename || this._basename(path); - this.fileSize = fileSize; - this.encoding = encoding || "binary"; - this.contentType = contentType || 'application/octet-stream'; -} - -File.prototype = { - _basename: function(path) { - var parts = path.split(/\/|\\/); - return parts[parts.length - 1]; - } -}; - -function Data(filename, contentType, data) { - this.filename = filename; - this.contentType = contentType || 'application/octet-stream'; - this.data = data; -} - -function Part(name, value, boundary) { - this.name = name; - this.value = value; - this.boundary = boundary; -} - - -Part.prototype = { - - //returns the Content-Disposition header - header: function() { - var header; - - if (this.value.data) { - header = "Content-Disposition: form-data; name=\"" + this.name + - "\"; filename=\"" + this.value.filename + "\"\r\n" + - "Content-Length: " + this.value.data.length + "\r\n" + - "Content-Type: " + this.value.contentType; - } else if (this.value instanceof File) { - header = "Content-Disposition: form-data; name=\"" + this.name + - "\"; filename=\"" + this.value.filename + "\"\r\n" + - "Content-Length: " + this.value.fileSize + "\r\n" + - "Content-Type: " + this.value.contentType; - } else { - header = "Content-Disposition: form-data; name=\"" + this.name + "\""; - } - - return "--" + this.boundary + "\r\n" + header + "\r\n\r\n"; - }, - - //calculates the size of the Part - sizeOf: function() { - var valueSize; - if (this.value instanceof File) { - valueSize = this.value.fileSize; - } else if (this.value.data) { - valueSize = this.value.data.length; - } else if (typeof this.value === 'number') { - valueSize = this.value.toString().length; - } else { - valueSize = this.value.length; - } - return valueSize + this.header().length + 2; - }, - - // Writes the Part out to a writable stream that supports the write(data) method - // You can also pass in a String and a String will be returned to the callback - // with the whole Part - // Calls the callback when complete - write: function(stream, callback) { - - var self = this; - - //first write the Content-Disposition - stream.write(this.header()); - - //Now write out the body of the Part - if (this.value instanceof File) { - fs.open(this.value.path, "r", 0666, function (err, fd) { - if (err) throw err; - - var position = 0; - - (function reader () { - fs.read(fd, 1024 * 4, position, "binary", function (er, chunk) { - if (er) callback(err); - stream.write(chunk); - position += 1024 * 4; - if (chunk) reader(); - else { - stream.write("\r\n") - callback(); - fs.close(fd); - } - }); - })(); // reader() - }); - } else if (this.value instanceof Data) { - stream.write(this.value.data); - stream.write("\r\n"); - callback(); - } else { - stream.write(this.value + "\r\n"); - callback(); - } - } -} - -//Renamed to MultiPartRequest from Request -function MultiPartRequest(data, boundary) { - this.encoding = 'binary'; - this.boundary = boundary || exports.defaultBoundary; - this.data = data; - this.partNames = this._partNames(); -} - -MultiPartRequest.prototype = { - _partNames: function() { - var partNames = []; - for (var name in this.data) { - partNames.push(name) - } - return partNames; - }, - - write: function(stream, callback) { - var partCount = 0, self = this; - - // wrap the stream in our own Stream object - // See the Stream function above for the benefits of this - var stream = new Stream(stream); - - // Let each part write itself out to the stream - (function writePart() { - var partName = self.partNames[partCount]; - var part = new Part(partName, self.data[partName], self.boundary); - part.write(stream, function (err) { - if (err) { - callback(err); - return; - } - partCount += 1; - if (partCount < self.partNames.length) - writePart(); - else { - stream.write('--' + self.boundary + '--' + "\r\n"); - - if (callback) callback(stream.string || ""); - } - }); - })(); - } -} - -var exportMethods = { - file: function(path, filename, fileSize, encoding, contentType) { - return new File(path, filename, fileSize, encoding, contentType) - }, - data: function(filename, contentType, data) { - return new Data(filename, contentType, data); - }, - sizeOf: function(parts, boundary) { - var totalSize = 0; - boundary = boundary || exports.defaultBoundary; - for (var name in parts) totalSize += new Part(name, parts[name], boundary).sizeOf(); - return totalSize + boundary.length + 6; - }, - write: function(stream, data, callback, boundary) { - var r = new MultiPartRequest(data, boundary); - r.write(stream, callback); - return r; - } -} - -Object.keys(exportMethods).forEach(function(exportMethod) { - exports[exportMethod] = exportMethods[exportMethod] -}) - -},{"fs":undefined,"util":undefined}],180:[function(require,module,exports){ -var util = require('util'), - events = require("events"), - http = require('http'), - https = require('https'), - url = require('url'), - qs = require('qs'), - multipart = require('./multipartform'), - zlib = require('zlib'), - iconv = require('iconv-lite'); - -function mixin(target, source) { - source = source || {}; - Object.keys(source).forEach(function(key) { - target[key] = source[key]; - }); - - return target; -} - -function Request(uri, options) { - events.EventEmitter.call(this); - this.url = url.parse(uri); - this.options = options; - this.headers = { - 'Accept': '*/*', - 'User-Agent': 'Restler for node.js', - 'Host': this.url.host - }; - - this.headers['Accept-Encoding'] = 'gzip, deflate'; - - mixin(this.headers, options.headers || {}); - - // set port and method defaults - if (!this.url.port) this.url.port = (this.url.protocol == 'https:') ? '443' : '80'; - if (!this.options.method) this.options.method = (this.options.data) ? 'POST' : 'GET'; - if (typeof this.options.followRedirects == 'undefined') this.options.followRedirects = true; - - // stringify query given in options of not given in URL - if (this.options.query && !this.url.query) { - if (typeof this.options.query == 'object') - this.url.query = qs.stringify(this.options.query); - else this.url.query = this.options.query; - } - - this._applyAuth(); - - if (this.options.multipart) { - this.headers['Content-Type'] = 'multipart/form-data; boundary=' + multipart.defaultBoundary; - var multipart_size = multipart.sizeOf(this.options.data, multipart.defaultBoundary); - if (typeof multipart_size === 'number' && multipart_size === multipart_size) { - this.headers['Content-Length'] = multipart_size; - } - else { - console.log("Building multipart request without Content-Length header, please specify all file sizes"); - } - } else { - if (typeof this.options.data == 'object' && !Buffer.isBuffer(this.options.data)) { - this.options.data = qs.stringify(this.options.data); - this.headers['Content-Type'] = 'application/x-www-form-urlencoded'; - this.headers['Content-Length'] = this.options.data.length; - } - if (typeof this.options.data == 'string') { - var buffer = new Buffer(this.options.data, this.options.encoding || 'utf8'); - this.options.data = buffer; - this.headers['Content-Length'] = buffer.length; - } - if (!this.options.data) { - this.headers['Content-Length'] = 0; - } - } - - var proto = (this.url.protocol == 'https:') ? https : http; - - this.request = proto.request({ - host: this.url.hostname, - port: this.url.port, - path: this._fullPath(), - method: this.options.method, - headers: this.headers, - rejectUnauthorized: this.options.rejectUnauthorized, - agent: this.options.agent - }); - - this._makeRequest(); -} - -util.inherits(Request, events.EventEmitter); - -mixin(Request.prototype, { - _isRedirect: function(response) { - return ([301, 302, 303, 307].indexOf(response.statusCode) >= 0); - }, - _fullPath: function() { - var path = this.url.pathname || '/'; - if (this.url.hash) path += this.url.hash; - if (this.url.query) path += '?' + this.url.query; - return path; - }, - _applyAuth: function() { - var authParts; - - if (this.url.auth) { - authParts = this.url.auth.split(':'); - this.options.username = authParts[0]; - this.options.password = authParts[1]; - } - - if (this.options.username && this.options.password !== undefined) { - var b = new Buffer([this.options.username, this.options.password].join(':')); - this.headers['Authorization'] = "Basic " + b.toString('base64'); - } else if (this.options.accessToken) { - this.headers['Authorization'] = "Bearer " + this.options.accessToken; - } - }, - _responseHandler: function(response) { - var self = this; - - if (self._isRedirect(response) && self.options.followRedirects) { - try { - // 303 should redirect and retrieve content with the GET method - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 - if (response.statusCode === 303) { - self.url = url.parse(url.resolve(self.url.href, response.headers['location'])); - self.options.method = 'GET'; - delete self.options.data; - self._retry(); - } else { - self.url = url.parse(url.resolve(self.url.href, response.headers['location'])); - self._retry(); - // todo handle somehow infinite redirects - } - } catch(err) { - err.message = 'Failed to follow redirect: ' + err.message; - self._fireError(err, response); - } - } else { - var body = ''; - - // When using browserify, response.setEncoding is not defined - if (typeof response.setEncoding == 'function') - response.setEncoding('binary'); - - response.on('data', function(chunk) { - body += chunk; - }); - - response.on('end', function() { - response.rawEncoded = body; - self._decode(new Buffer(body, 'binary'), response, function(err, body) { - if (err) { - self._fireError(err, response); - return; - } - response.raw = body; - body = self._iconv(body, response); - self._encode(body, response, function(err, body) { - if (err) { - self._fireError(err, response); - } else { - self._fireSuccess(body, response); - } - }); - }); - }); - } - }, - _decode: function(body, response, callback) { - var decoder = response.headers['content-encoding']; - if (decoder in decoders) { - decoders[decoder].call(response, body, callback); - } else { - callback(null, body); - } - }, - _iconv: function(body, response) { - var charset = response.headers['content-type']; - if (charset) { - charset = /\bcharset=(.+)(?:;|$)/i.exec(charset); - if (charset) { - charset = charset[1].trim().toUpperCase(); - if (charset != 'UTF-8') { - try { - return iconv.decode(body, charset); - } catch (err) {} - } - } - } - return body; - }, - _encode: function(body, response, callback) { - var self = this; - if (self.options.decoding == 'buffer') { - callback(null, body); - } else { - body = body.toString(self.options.decoding); - if (self.options.parser) { - self.options.parser.call(response, body, callback); - } else { - callback(null, body); - } - } - }, - _fireError: function(err, response) { - this._fireCancelTimeout(); - this.emit('error', err, response); - this.emit('complete', err, response); - }, - _fireCancelTimeout: function(){ - var self = this; - if(self.options.timeout){ - clearTimeout(self.options.timeoutFn); - } - }, - _fireTimeout: function(err){ - this.emit('timeout', err); - this.aborted = true; - this.timedout = true; - this.request.abort(); - }, - _fireSuccess: function(body, response) { - if (parseInt(response.statusCode) >= 400) { - this.emit('fail', body, response); - } else { - this.emit('success', body, response); - } - this.emit(response.statusCode.toString().replace(/\d{2}$/, 'XX'), body, response); - this.emit(response.statusCode.toString(), body, response); - this.emit('complete', body, response); - }, - _makeRequest: function() { - var self = this; - var timeoutMs = self.options.timeout; - if(timeoutMs){ - self.options.timeoutFn = setTimeout(function(){ - self._fireTimeout(timeoutMs); - },timeoutMs); - } - this.request.on('response', function(response) { - self._fireCancelTimeout(); - self.emit('response', response); - self._responseHandler(response); - }).on('error', function(err) { - self._fireCancelTimeout(); - if (!self.aborted) { - self._fireError(err, null); - } - }); - }, - _retry: function() { - this.request.removeAllListeners().on('error', function() {}); - if (this.request.finished) { - this.request.abort(); - } - Request.call(this, this.url.href, this.options); // reusing request object to handle recursive calls and remember listeners - this.run(); - }, - run: function() { - var self = this; - if (this.options.multipart) { - multipart.write(this.request, this.options.data, function() { - self.request.end(); - }); - } else { - if (this.options.data) { - this.request.write(this.options.data, this.options.encoding || 'utf8'); - } - this.request.end(); - } - - return this; - }, - abort: function(err) { - var self = this; - - if (err) { - if (typeof err == 'string') { - err = new Error(err); - } else if (!(err instanceof Error)) { - err = new Error('AbortError'); - } - err.type = 'abort'; - } else { - err = null; - } - - self.request.on('close', function() { - if (err) { - self._fireError(err, null); - } else { - self.emit('complete', null, null); - } - }); - - self.aborted = true; - self.request.abort(); - self.emit('abort', err); - return this; - }, - retry: function(timeout) { - var self = this; - timeout = parseInt(timeout); - var fn = self._retry.bind(self); - if (!isFinite(timeout) || timeout <= 0) { - process.nextTick(fn, timeout); - } else { - setTimeout(fn, timeout); - } - return this; - } -}); - -function shortcutOptions(options, method) { - options = options || {}; - options.method = method; - options.parser = (typeof options.parser !== "undefined") ? options.parser : parsers.auto; - parsers.xml.options = (typeof options.xml2js == 'undefined') ? {} : options.xml2js; - return options; -} - -function request(url, options) { - var request = new Request(url, options); - request.on('error', function() {}); - process.nextTick(request.run.bind(request)); - return request; -} - -function get(url, options) { - return request(url, shortcutOptions(options, 'GET')); -} - -function patch(url, options) { - return request(url, shortcutOptions(options, 'PATCH')); -} - -function post(url, options) { - return request(url, shortcutOptions(options, 'POST')); -} - -function put(url, options) { - return request(url, shortcutOptions(options, 'PUT')); -} - -function del(url, options) { - return request(url, shortcutOptions(options, 'DELETE')); -} - -function head(url, options) { - return request(url, shortcutOptions(options, 'HEAD')); -} - -function json(url, data, options, method) { - options = options || {}; - options.parser = (typeof options.parser !== "undefined") ? options.parser : parsers.auto; - options.headers = options.headers || {}; - options.headers['content-type'] = 'application/json'; - options.data = JSON.stringify(data || {}); - options.method = method || 'GET'; - return request(url, options); -} - -function postJson(url, data, options) { - return json(url, data, options, 'POST'); -} - -function putJson(url, data, options) { - return json(url, data, options, 'PUT'); -} - -function patchJson(url, data, options) { - return json(url, data, options, 'PATCH'); -} - -var parsers = { - auto: function(data, callback) { - var contentType = this.headers['content-type']; - var contentParser; - if (contentType) { - contentType = contentType.replace(/;.+/, ''); // remove all except mime type (eg. text/html; charset=UTF-8) - if (contentType in parsers.auto.matchers) { - contentParser = parsers.auto.matchers[contentType]; - } else { - // custom (vendor) mime types - var parts = contentType.match(/^([\w-]+)\/vnd((?:\.(?:[\w-]+))+)\+([\w-]+)$/i); - if (parts) { - var type = parts[1]; - var vendors = parts[2].substr(1).split('.'); - var subtype = parts[3]; - var vendorType; - while (vendors.pop() && !(vendorType in parsers.auto.matchers)) { - vendorType = vendors.length - ? type + '/vnd.' + vendors.join('.') + '+' + subtype - : vendorType = type + '/' + subtype; - } - contentParser = parsers.auto.matchers[vendorType]; - } - } - } - if (typeof contentParser == 'function') { - contentParser.call(this, data, callback); - } else { - callback(null, data); - } - }, - json: function(data, callback) { - if (data && data.length) { - var parsedData; - try { - parsedData = JSON.parse(data); - } catch (err) { - err.message = 'Failed to parse JSON body: ' + err.message; - callback(err, null); - } - if (parsedData !== undefined) { - callback(null, parsedData); - } - } else { - callback(null, null); - } - } -}; - -parsers.auto.matchers = { - 'application/json': parsers.json -}; - -try { - var yaml = require('yaml'); - - parsers.yaml = function(data, callback) { - if (data) { - try { - callback(null, yaml.eval(data)); - } catch (err) { - err.message = 'Failed to parse YAML body: ' + err.message; - callback(err, null); - } - } else { - callback(null, null); - } - }; - - parsers.auto.matchers['application/yaml'] = parsers.yaml; -} catch(e) {} - -try { - var xml2js = require('xml2js'); - - parsers.xml = function(data, callback) { - if (data) { - var parser = new xml2js.Parser(parsers.xml.options); - parser.parseString(data, function(err, data) { - if (err) { - err.message = 'Failed to parse XML body: ' + err.message; - } - callback(err, data); - }); - } else { - callback(null, null); - } - }; - - parsers.auto.matchers['application/xml'] = parsers.xml; -} catch(e) { } - -var decoders = { - gzip: function(buf, callback) { - zlib.gunzip(buf, callback); - }, - deflate: function(buf, callback) { - zlib.inflate(buf, callback); - } -}; - - -function Service(defaults) { - if (defaults.baseURL) { - this.baseURL = defaults.baseURL; - delete defaults.baseURL; - } - - this.defaults = defaults; -} - -mixin(Service.prototype, { - request: function(path, options) { - return request(this._url(path), this._withDefaults(options)); - }, - get: function(path, options) { - return get(this._url(path), this._withDefaults(options)); - }, - patch: function(path, options) { - return patch(this._url(path), this._withDefaults(options)); - }, - put: function(path, options) { - return put(this._url(path), this._withDefaults(options)); - }, - post: function(path, options) { - return post(this._url(path), this._withDefaults(options)); - }, - json: function(method, path, data, options) { - return json(this._url(path), data, this._withDefaults(options), method); - }, - del: function(path, options) { - return del(this._url(path), this._withDefaults(options)); - }, - _url: function(path) { - if (this.baseURL) return url.resolve(this.baseURL, path); - else return path; - }, - _withDefaults: function(options) { - var o = mixin({}, this.defaults); - return mixin(o, options); - } -}); - -function service(constructor, defaults, methods) { - constructor.prototype = new Service(defaults || {}); - mixin(constructor.prototype, methods); - return constructor; -} - -mixin(exports, { - Request: Request, - Service: Service, - request: request, - service: service, - get: get, - patch: patch, - post: post, - put: put, - del: del, - head: head, - json: json, - postJson: postJson, - putJson: putJson, - patchJson: patchJson, - parsers: parsers, - file: multipart.file, - data: multipart.data -}); - - -},{"./multipartform":179,"events":undefined,"http":undefined,"https":undefined,"iconv-lite":110,"qs":124,"url":undefined,"util":undefined,"xml2js":217,"yaml":240,"zlib":undefined}],181:[function(require,module,exports){ -/* eslint-disable node/no-deprecated-api */ -var buffer = require('buffer') -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - -},{"buffer":undefined}],182:[function(require,module,exports){ -// wrapper for non-node envs -;(function (sax) { - -sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } -sax.SAXParser = SAXParser -sax.SAXStream = SAXStream -sax.createStream = createStream - -// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. -// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), -// since that's the earliest that a buffer overrun could occur. This way, checks are -// as rare as required, but as often as necessary to ensure never crossing this bound. -// Furthermore, buffers are only tested at most once per write(), so passing a very -// large string into write() might have undesirable effects, but this is manageable by -// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme -// edge case, result in creating at most one complete copy of the string passed in. -// Set to Infinity to have unlimited buffers. -sax.MAX_BUFFER_LENGTH = 64 * 1024 - -var buffers = [ - "comment", "sgmlDecl", "textNode", "tagName", "doctype", - "procInstName", "procInstBody", "entity", "attribName", - "attribValue", "cdata", "script" -] - -sax.EVENTS = // for discoverability. - [ "text" - , "processinginstruction" - , "sgmldeclaration" - , "doctype" - , "comment" - , "attribute" - , "opentag" - , "closetag" - , "opencdata" - , "cdata" - , "closecdata" - , "error" - , "end" - , "ready" - , "script" - , "opennamespace" - , "closenamespace" - ] - -function SAXParser (strict, opt) { - if (!(this instanceof SAXParser)) return new SAXParser(strict, opt) - - var parser = this - clearBuffers(parser) - parser.q = parser.c = "" - parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH - parser.opt = opt || {} - parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags - parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase" - parser.tags = [] - parser.closed = parser.closedRoot = parser.sawRoot = false - parser.tag = parser.error = null - parser.strict = !!strict - parser.noscript = !!(strict || parser.opt.noscript) - parser.state = S.BEGIN - parser.ENTITIES = Object.create(sax.ENTITIES) - parser.attribList = [] - - // namespaces form a prototype chain. - // it always points at the current tag, - // which protos to its parent tag. - if (parser.opt.xmlns) parser.ns = Object.create(rootNS) - - // mostly just for error reporting - parser.trackPosition = parser.opt.position !== false - if (parser.trackPosition) { - parser.position = parser.line = parser.column = 0 - } - emit(parser, "onready") -} - -if (!Object.create) Object.create = function (o) { - function f () { this.__proto__ = o } - f.prototype = o - return new f -} - -if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) { - return o.__proto__ -} - -if (!Object.keys) Object.keys = function (o) { - var a = [] - for (var i in o) if (o.hasOwnProperty(i)) a.push(i) - return a -} - -function checkBufferLength (parser) { - var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) - , maxActual = 0 - for (var i = 0, l = buffers.length; i < l; i ++) { - var len = parser[buffers[i]].length - if (len > maxAllowed) { - // Text/cdata nodes can get big, and since they're buffered, - // we can get here under normal conditions. - // Avoid issues by emitting the text node now, - // so at least it won't get any bigger. - switch (buffers[i]) { - case "textNode": - closeText(parser) - break - - case "cdata": - emitNode(parser, "oncdata", parser.cdata) - parser.cdata = "" - break - - case "script": - emitNode(parser, "onscript", parser.script) - parser.script = "" - break - - default: - error(parser, "Max buffer length exceeded: "+buffers[i]) - } - } - maxActual = Math.max(maxActual, len) - } - // schedule the next check for the earliest possible buffer overrun. - parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual) - + parser.position -} - -function clearBuffers (parser) { - for (var i = 0, l = buffers.length; i < l; i ++) { - parser[buffers[i]] = "" - } -} - -function flushBuffers (parser) { - closeText(parser) - if (parser.cdata !== "") { - emitNode(parser, "oncdata", parser.cdata) - parser.cdata = "" - } - if (parser.script !== "") { - emitNode(parser, "onscript", parser.script) - parser.script = "" - } -} - -SAXParser.prototype = - { end: function () { end(this) } - , write: write - , resume: function () { this.error = null; return this } - , close: function () { return this.write(null) } - , flush: function () { flushBuffers(this) } - } - -try { - var Stream = require("stream").Stream -} catch (ex) { - var Stream = function () {} -} - - -var streamWraps = sax.EVENTS.filter(function (ev) { - return ev !== "error" && ev !== "end" -}) - -function createStream (strict, opt) { - return new SAXStream(strict, opt) -} - -function SAXStream (strict, opt) { - if (!(this instanceof SAXStream)) return new SAXStream(strict, opt) - - Stream.apply(this) - - this._parser = new SAXParser(strict, opt) - this.writable = true - this.readable = true - - - var me = this - - this._parser.onend = function () { - me.emit("end") - } - - this._parser.onerror = function (er) { - me.emit("error", er) - - // if didn't throw, then means error was handled. - // go ahead and clear error, so we can write again. - me._parser.error = null - } - - this._decoder = null; - - streamWraps.forEach(function (ev) { - Object.defineProperty(me, "on" + ev, { - get: function () { return me._parser["on" + ev] }, - set: function (h) { - if (!h) { - me.removeAllListeners(ev) - return me._parser["on"+ev] = h - } - me.on(ev, h) - }, - enumerable: true, - configurable: false - }) - }) -} - -SAXStream.prototype = Object.create(Stream.prototype, - { constructor: { value: SAXStream } }) - -SAXStream.prototype.write = function (data) { - if (typeof Buffer === 'function' && - typeof Buffer.isBuffer === 'function' && - Buffer.isBuffer(data)) { - if (!this._decoder) { - var SD = require('string_decoder').StringDecoder - this._decoder = new SD('utf8') - } - data = this._decoder.write(data); - } - - this._parser.write(data.toString()) - this.emit("data", data) - return true -} - -SAXStream.prototype.end = function (chunk) { - if (chunk && chunk.length) this.write(chunk) - this._parser.end() - return true -} - -SAXStream.prototype.on = function (ev, handler) { - var me = this - if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) { - me._parser["on"+ev] = function () { - var args = arguments.length === 1 ? [arguments[0]] - : Array.apply(null, arguments) - args.splice(0, 0, ev) - me.emit.apply(me, args) - } - } - - return Stream.prototype.on.call(me, ev, handler) -} - - - -// character classes and tokens -var whitespace = "\r\n\t " - // this really needs to be replaced with character classes. - // XML allows all manner of ridiculous numbers and digits. - , number = "0124356789" - , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - // (Letter | "_" | ":") - , quote = "'\"" - , entity = number+letter+"#" - , attribEnd = whitespace + ">" - , CDATA = "[CDATA[" - , DOCTYPE = "DOCTYPE" - , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" - , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/" - , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } - -// turn all the string character sets into character class objects. -whitespace = charClass(whitespace) -number = charClass(number) -letter = charClass(letter) - -// http://www.w3.org/TR/REC-xml/#NT-NameStartChar -// This implementation works on strings, a single character at a time -// as such, it cannot ever support astral-plane characters (10000-EFFFF) -// without a significant breaking change to either this parser, or the -// JavaScript language. Implementation of an emoji-capable xml parser -// is left as an exercise for the reader. -var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - -var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ - -quote = charClass(quote) -entity = charClass(entity) -attribEnd = charClass(attribEnd) - -function charClass (str) { - return str.split("").reduce(function (s, c) { - s[c] = true - return s - }, {}) -} - -function isRegExp (c) { - return Object.prototype.toString.call(c) === '[object RegExp]' -} - -function is (charclass, c) { - return isRegExp(charclass) ? !!c.match(charclass) : charclass[c] -} - -function not (charclass, c) { - return !is(charclass, c) -} - -var S = 0 -sax.STATE = -{ BEGIN : S++ -, TEXT : S++ // general stuff -, TEXT_ENTITY : S++ // & and such. -, OPEN_WAKA : S++ // < -, SGML_DECL : S++ // -, SCRIPT : S++ //