dialog over whiptail - choose one TUI type

Change all whiptail for dialog.
The code is currently using dialog and whiptail and even if they are similar, dialog is much more customizable and easier to deal with.
If I use JoininBox .dialogrc, it works for dialog yeah, but a huge discrepancy in colors when switching to whiptail for basic info messages.

At some points whiptail was choosen because (at least on MacOS) it allows copy+paste from the terminal for addresses, etc. So if we go for one I might go for whiptail BUT for the python scripts I just found a dialog library - not a whiptail library. So I think changing to just one would be a nice to have to be "more clean" but for practical reasons we just keep using both.

Ok, did not know dialog was not possible to copy, so another alternative for things like this, instead of using whiptail is printing directly to the terminal, example is when showing the addresses for the services, certificate fingerprint.
Quick search and did not found how to copy from dialogbox :(

Is there any pressing reason not to use both other than "having more consistent code"?

Not much (appearance, more options) but consistent code is kinda relevant to be easier to maintain.

Printing in terminal is an alternative to using whiptail to copy paste, but I don't see the need to refactor these.
The different colours of JoininBox is intentional to differentiate between the projects so it is obvious which menu is on.

Also the TUI refers to the Touch User Interface, is that a typo here?

Printing in terminal is an alternative to using whiptail to copy paste, but I don't see the need to refactor these.

The other problem is that SHA1 for the certificate is not as secure as SHA256 of course, and is pretty much not recommended to verify anything, https://github.com/rootzoll/raspiblitz/issues/2378, but it does not fit the whiptail 80 width.

The different colours of JoininBox is intentional to differentiate between the projects so it is obvious which menu is on.

I get this point, I was thinking about it.

Also the TUI refers to the Touch User Interface, is that a typo here?
Based on this https://askubuntu.com/questions/867416/are-there-differences-between-cli-and-tui, I am calling TUI the Terminal User Interface and CLI the Command Line Interface.
TUI being whiptail or dialog
CLI being bitcoin-cli or lncli

Not urgent right now, but consistency is important.

ok, it is a good point about SHA1. Now it is very inconvenient to verify even with the shorter insecure fingerprints.
I do prefer to show the longer texts in the terminal with an accompanying QRcode.
Same for the SSL fingerprints and Hidden Services.
Aesthetics is not really something we can optimize in the terminal, but can communicate more data better.


Sp/async call wasm

Description
Please provide a paragraph or two giving a summary of the change, including relevant motivation and context.
Checklist:

[ ] I have reviewed my diff in github, line by line.
[ ] Every change is related to the PR description.
[ ] I have linked this pull request to the issue(s) that it resolves.
[ ] There are no unexpected formatting changes, superfluous debug logs, or commented-out code.
[ ] The branch has been rebased against the head of its merge target.
[ ] I'm happy for the PR to be merged at the reviewer's next convenience.

Right, forgot about this implication of async call - though I guess it was inevitable as we either need to call asyncCall (because it now can fetch Crs data), or asynchronously read Crs data into C++ like we used to


Future of emperror

The emperror is good and feature-rich error package, but it has not updated in 2 years. Is it maintained yet?
Is there any logr-like error handling module, which is pluginable and emperror can implement it?

Admittedly, I've neglected the project lately, but it's still very much in use. I'll try to spend some time on it.

Is there any logr-like error handling module, which is pluginable and emperror can implement it?

I'm not entirely sure what you are looking for. What should be "logr-like" and how should emperror implement it?


DOC-6643 fix links missed by builder

Addresses: DOC-6643

Fixes links to non-CC content that 404d. These links were not caught as broken by the builder, as https://github.com/cockroachdb/docs/pull/16016 passed all checks for build & merge - spawning separate investigation in D O C - 6 6 4 4 to troubleshoot.

Staging
WIP

All green! But do I trust it .... ?


All: Fix the TypeError exception seen in retrieve method

This fixes the TypeError exception when retrieve called before the resource discovery.
Signed-off-by: Sudarsana Nagineni<EMAIL_ADDRESS>

We agreed to fix this differently - by treating the retrieval of a previously unseen resource as a resource discovery.


pbrmetallicroughness being set to empty when no values present

Need to not create if there are no parameters available for it in the runtime abstraction.

Merged #201


Visual Studio Code's "Jupyter: Variables" view does not display any C# variables

Describe the bug
Visual Studio Code's "Jupyter: Variables" view does not display any C# variables. See screenshot below
Please complete the following:
Which version of .NET Interactive are you using?
Version: 1.0.240403+56a0e392fba305af06e72ce7dec885b2b6722c00
Build date: 2021-09-07T20:19:53.1655074Z

OS

[X ] Windows 10
[ ] macOS
[ ] Linux (Please specify distro)
[ ] iOS
[ ] Android

Browser

[ ] Chrome
[ ] Edge
[ ] Firefox
[ ] Safari

Frontend

[ ] Jupyter Notebook
[ ] Jupyter Lab
[ ] nteract
[ X] Visual Studio Code
[ ] Visual Studio Code Insiders
[ ] Other (please specify)

Screenshots

Same with PowerShell.

We're working with VS Code to enable this feature. I believe it currently only works for Python.

.NET Interactive now has its own separate variable explorer.


Case-sensitive headers issue

Hello! Sanic uses plain dicts to keep headers which causes the headers to be case-sensitive.
According to RFC 2616 headers should be case-insensitive.
This causes issues when we want to override headers' values.
Simple example to test:
@app.route("")
async def test(request: Request):
    return json({
        "ok": True
    }, headers={
        'CONTENT-TYPE': 'application/json'
    })

requesting such endpoint will return 'doubled' headers:
CONTENT-TYPE: application/json
Content-Length: 11
Content-Type: application/json

there is a simple CIDict (https://github.com/channelcat/sanic/blob/master/sanic/server.py#L42) in server.py module we can use, but it's a little buggy now because it doesn't handle some cases, like initializing CIDict with non-empty dict.


'Terminal: Copy Selection' no way to be executed from the command palette

Refs: #9100
Linux, insiders

Try to execute the command 'Terminal: Copy Selection' from the command palette
There is no way to do this, since when the command palette has focus the terminal does not and the action will complain
I would expect the action to still work, or to not be present in the command palette

This action and the paste into intregrated terminal do not feel like global workbench actions to me. Due to this and #9760 I propose to remove them from the command pallete. If there is no mechanism for global workbench actions to be omitted from the command pallete we should introduce one, since these actions should not be in the command pallete imho

This is a know issue, it can be made to work once virtual selection is added to xterm.js https://github.com/sourcelair/xterm.js/issues/207

This will be fixed when we manage the selection model ourselves https://github.com/Microsoft/vscode/issues/9958

Fixed in https://github.com/sourcelair/xterm.js/pull/670


chore: ciskubebench by node

Codecov Report

Merging #7 (4d49104) into main (cf2ef21) will decrease coverage by 32.98%.
The diff coverage is 0.00%.

@@             Coverage Diff             @@
##             main       #7       +/-   ##
===========================================
- Coverage   70.59%   37.61%   -32.99%
===========================================
  Files          63       62        -1
  Lines        4054     3935      -119
===========================================
- Hits         2862     1480     -1382
- Misses        874     2364     +1490
+ Partials      318       91      -227

Impacted Files
Coverage Δ

pkg/cmd/scan_ciskubebench.go
0.00% <0.00%> (-57.15%)
:arrow_down:

pkg/kube/cr_manager.go
0.00% <0.00%> (-49.05%)
:arrow_down:

pkg/cmd/get.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/cmd/find.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/cmd/root.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/cmd/scan.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/cmd/polaris.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/cmd/version.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/cmd/kube_bench.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/cmd/kube_hunter.go
0.00% <0.00%> (-100.00%)
:arrow_down:

... and 36 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update cf2ef21...4d49104. Read the comment docs.


Allow user supplied configs.

Hi,
Thank you for the work you did on this plugin, it's very valuable to me.
One use case I needed was passing flags when running Debug Packae and because I mostly use this setting also having it as a config I can choose from in the list.
This PR allows the user to supply their own configs when setup is called and append them to the existing list of configs.
Example usage
require('dap-go').setup({
    {
        type = "go",
        name = "Debug Package + Config",
        request = "launch",
        program = "${fileDirname}",
        args = { "-l", "_infra/kustomize/overlays/config/common" },
    }
})

And here's what the list of options to choose from would look like in this case.

I'm sorry my formatter took some liberties.  If you would like me to undo those I can.

Hi @sir-wiggles, I really like your idea and I look forward to merge your PR. Please check my review comment. It would also be great to have some doc update describing how to configure this in the README.md before merging.

@sir-wiggles Can you please rebase your branch with the latest from the main branch? I enabled lint and style checks in the project.

I've updated the conflicts, but the other stuff will take me a little longer.  I don't really know lua so might take me some time to learn it.

I've updated the conflicts, but the other stuff will take me a little longer. I don't really know lua so might take me some time to learn it.

Ok.. I'll merge and implement the changes myself. It won't work the way you describe initially.
Users will have to configure with something like:
require('dap-go').setup({
    dap_configurations = {
      {
        type = "go",
        name = "Debug Package + Config",
        request = "launch",
        program = "${fileDirname}",
        args = { "-l", "_infra/kustomize/overlays/config/common" },
      },
    },
})


Git permissions error causing failing pipelines

Bug Description
Seeing workflow errors related to new git security upgrades on GHA runners.
Additional context
https://github.com/actions/runner-images/issues/6775

According to the referenced issue, the fix should be something like:
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3
      - run: git config --global --add safe.directory "$GITHUB_WORKSPACE"


fix(source): resolve avro Ref during avro_schema_to_column_descs without hack

I hereby agree to the terms of the RisingWave Labs, Inc. Contributor License Agreement.
What's changed and what's your intention?
Part of #17020. Ref in avro used to be supported by a hack we added in our apache_avro fork. This PR avoids the hack (replacing Ref with their referee in-place, resulting in an invalid tree containing duplicate definitions). The hack fails to work when there is Ref inside Ref - resulting in either unresolved Ref or infinite recursion.
This PR only corrects part of the usage - in avro_schema_to_column_descs to derive RisingWave column data types from avro schema. There will be a follow-up to correct the usage in convert_to_datum/AvroAccess. Without the latter part, simple data types like int (inside a Ref in another Ref) can already be supported.
Instead of building the expanded-yet-invalid tree as in the hack, this solution passes a NamesRef obtained from the root. Its complexity of having an associated lifetime is easy to deal with in this context. (To contrast, prost_reflect for protobuf builds the tree with Arc - no lifetime and no duplication. But apache_avro::Schema does not use Arc.)
The circular reference rejection logic is same as #10499 for protobuf. It can be DRY'ed with error message improved later.
This is intended to be part of v2.2 and NOT cherry-picked into earlier versions. There has been a further hack available for earlier versions that can be cherry-picked on demand - where the user is responsible for not using circular reference or an infinite recursion would happen.

Checklist

[x] I have written necessary rustdoc comments
[x] I have added necessary unit tests and integration tests
[ ] I have added test labels as necessary. See details.
[ ] I have added fuzzing tests or opened an issue to track them. (Optional, recommended for new SQL features #7934).
[ ] My PR contains breaking changes. (If it deprecates some features, please create a tracking issue to remove them in the future).
[x] All checks passed in ./risedev check (or alias, ./risedev c)
[ ] My PR changes performance-critical code. (Please run macro/micro-benchmarks and show the results.)

[ ] My PR contains critical fixes that are necessary to be merged into the latest release. (Please check out the details)

Documentation

[ ] My PR needs documentation updates. (Please use the Release note section below to summarize the impact on users)

Release note
If this PR includes changes that directly affect users or other significant modifications relevant to the community, kindly draft a release note to provide a concise summary of these changes. Please prioritize highlighting the impact these changes will have on users.

For context, this is the error reported for the added test case if this PR was not applied:
ERROR:  Failed to run the query

Caused by these errors (recent errors listed first):
  1: connector error
  2: Feature is not yet implemented: Avro type: Ref { name: Name { name: "Point", namespace: None } }
No tracking issue yet. Feel free to submit a feature request at https://github.com/risingwavelabs/risingwave/issues/new?labels=type%2Ffeature&template=feature_request.yml

There will be a follow-up to correct the usage in convert_to_datum/AvroAccess. Without the latter part, simple data types like int (inside a Ref in another Ref) can already be supported.

Both parts will be included in v2.2. In this intermediate state, decimal inside a Ref in another Ref would result in a parsing error and filled with null, instead of creation rejected without this first part.


WHY it shows "command shapes is unrecognized"

When I finished the installation and run the spider, the "command shapes is unrecognized" is found in screen, how to deal with it?

install this directly from GitHub:
net install graphfunctions, from("https://raw.githubusercontent.com/asjadnaqvi/stata-graphfunctions/main/installation/") replace

The SSC version doesn't current have the shapes program.

Thanks! It makes sense now.
Best regards,
Xiaokun
--
Bryce, Yu Xiaokun
Department of Economics, FSS
University of Macau
Tel.:<PHONE_NUMBER>9
Email: @.***
重要提示：此]件的热莺腿魏胃郊际潜Ｃ艿摹Ｎ唇l件人嫱猓澜c任何第三方分享此消息的任何部分。如果您`收到此消息，回复此消息Kh除，xx。
IMPORTANT: The contents of this email and any attachments are confidential. It is strictly forbidden to share any part of this message with any third party, without a written consent of the sender. If you received this message by mistake, please reply to this message and follow with its deletion, thanks.

Please consider the environment before printing this email.

发件人: Asjad Naqvi @.>
发送时间: 2024年10月15日 13:21
收件人: asjadnaqvi/stata-spider @.>
抄送: Bryce YU @.>; Author @.>
主题: Re: [asjadnaqvi/stata-spider] WHY it shows "command shapes is unrecognized" (Issue #18)
install this directly from GitHub:
net install graphfunctions, from("https://raw.githubusercontent.com/asjadnaqvi/stata-graphfunctions/main/installation/") replace
The SSC version doesn't currently have the shapes program.
―
Reply to this email directly, view it on GitHubhttps://github.com/asjadnaqvi/stata-spider/issues/18#issuecomment-2412922466, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AYGPZAXQXZ6OELLBKC4N3YLZ3SQ4RAVCNFSM6AAAAABP6JDC6GVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDIMJSHEZDENBWGY.
You are receiving this because you authored the thread.Message ID: @.***>

Thank you for pointing it out! I have updated the readme with better instructions on how deal with this.


Is there any possibility to localize error messages?

Hi,
first, thanks for this great piece of software! Currently I'm trying to localize the most common messages which a user might see when using a picocli-based app. Via the resource bundle, it was easy to translate options, usage help, etc. 👍 However this doesn't work for error/help messages, resulting in a mix of English and German in the output:

Unknown option: '--help'
Aufruf: my-cli-ap ...
Hier kommt eine Beschreibung auf Deutsch.
Optionen:
-n, --node=

I see that "Unknown option:" is hard-coded in CommandLine.UnmatchedArgumentException.describe() (line 18669), and requires some special handling for the plural, which cannot be solved by simple resource files. Then I checked if it would be possible so subclass the Interpreter to override describe(). This is obviously not a good idea as describe() does more than only building the string, and is also impossible as there is not setter for an extended Interpreter implementation.
I wondered if there are any plans to offer an extension point where a custom "MessageProvider" may be set. This interface could then have methods like buildUnknownOptionMessage(String optionName, boolean isPlural) and be implemented for most languages.
The same applies for many more methods, e.g. readUserInput() ("Enter value for %s: ")

Indeed, this has been on the todo list for a long time.
See #485.
Some error messages are dynamically constructed but it should be possible to capture all patterns in MessageFormat.

I'd be happy to review pull requests if anyone is interested in working on this.
@lukaseckert will you be able to provide a pull request?

Hi @remkop ,
I can give it a try, however this may take some time as I'm doing my first steps with picocli and also do have to work on it in my spare time ;)
I'm not sure what you mean by "should be possible to capture all patterns in MessageFormat".

I'm not sure what you mean by "should be possible to capture all patterns in MessageFormat".

For example, there is this method that dynamically creates an error message:
private static String createMissingParameterMessage(ArgSpec argSpec, Range arity, List<PositionalParamSpec> missingList, Stack<String> args, int available) {
    if (arity.min == 1) {
        if (argSpec.isOption()) {
            return "Missing required parameter for " + optionDescription("", argSpec, 0);
        }
        String sep = "";
        String names = ": ";
        String indices = "";
        String infix = " at index ";
        int count = 0;
        for (PositionalParamSpec missing : missingList) {
            if (missing.arity().min > 0) {
                names += sep + "'" + missing.paramLabel() + "'";
                indices += sep + missing.index();
                sep = ", ";
                count++;
            }
        }
        String msg = "Missing required parameter";
        if (count > 1 || arity.min - available > 1) {
            msg += "s";
        }
        if (count > 1) { infix = " at indices "; }
        return System.getProperty("picocli.verbose.errors") != null ? msg + names + infix + indices : msg + names;
    } else if (args.isEmpty()) {
        return optionDescription("", argSpec, 0) +
                " requires at least " + arity.min + " values, but none were specified.";
    } else {
        return optionDescription("", argSpec, 0) +
                " requires at least " + arity.min + " values, but only " + available + " were specified: " + reverse(args);
    }
}

In the resource bundle, we would have to have key-value pairs for all possible permutations that could result from this.
The values would all be in MessageFormat:
missingParam1=Missing required parameter for {0}
missingParamMulti1=Missing required parameter {0} at index {1,number}
missingParamMulti=Missing required parameters {0} at indices {1}
missingParamMulti1Short=Missing required parameter {0}
missingParamMultiShort=Missing required parameters {0}
requiredAllMissing={0} requires at least {1,number} values, but none were specified.
requiredSomeMissing={0} requires at least {1,number} values, but only {2,number} were specified: {3}

Then, the logic in that method would have the same conditionals, but, instead of constructing the English message, it would select the correct key, get the pattern from the resource bundle, and then format the result, something like this:
...
    } else if (args.isEmpty()) {
        return MessageFormat.format(bundle.getString(requiredAllMissing),
                optionDescription("", argSpec, 0), arity.min);
    } else {
        return MessageFormat.format(bundle.getString(requiredSomeMissing),
                optionDescription("", argSpec, 0), arity.min, available, reverse(args));
    }

I can give it a try, however this may take some time as I'm doing my first steps with picocli and also do have to work on it in my spare time ;)

Sure, any help is welcome. Picocli is entirely done in my spare time also, so I fully understand! 😅


UE 4.16 with python 3.52 -- can't get installation from sources to work

My source install with Win UE 4.16 + python 3.5.2 doesn't work -- don't know if I made an error or if UE 4.16 is not yet supported? (I don't see a 4.16 + 3.5 binary release yet)
I followed steps for "Installation from sources on Windows (64 bit)" with no problem:

git cloned repo then copied that to /Plugins/UnrealEnginePython
"generate visual studio project files" succeeded
VS shows the plugin
VS build had no obvious errors but did show 3 warnings like this: "Module constructors should take a ReadOnlyTargetRules argument (rather than a TargetInfo argument) and pass it to the base class constructor from 4.15 onwards ... Plugins\UnrealEnginePython\Source\PythonConsole\PythonConsole.Build.cs"

However when I run Unreal editor the plugin does not  work:

"Window/Developer Tools" does not show "Python Console"
create from blueprint does not find any py* classes

I'm running 64 bit python 3.5.2, default install location and it's on %PATH%.
Any advice what to try next would be appreciated!

Hi, have you enabled the plugin in edit/plugins menu ?

Doh! Thanks, yes that was the problem.
I'm getting other build problems now but maybe I can sort those out myself...

I have plugin working, but I had to comment out this line in UnrealEnginePython.h to get it to build:
#pragma clang diagnostic ignored "-Wdelete-non-virtual-dtor"
Curious if anyone knows why that doesn't work?

That line is "surrounded" by #if defined(clang), is it possible you did not pulled latest changes ?

You're right, I pulled just before that change -- works after update.


Question

Do you want to do Pets as blocks?

Actual Pet Blocks might be kinda boring. I guess I could somehow implement them, but I don't want to work on this right now as it requires a lot of new code for a relatively small feature. I might consider it later.


Fix release notes link

Currently on https://react-redux.js.org/versions the link to the release notes of 7.2 leads to https://github.com/reduxjs/react-redux/releases/tag/v7.2 which is a 404. This commit changes that link to https://github.com/reduxjs/react-redux/releases/tag/v7.2.0

Thanks!


Support extra environment variables in the Chart (e.g. for HTTP Proxy)

Is your feature request related to a problem? Please describe.
I would like to use osc-bsu-csi-driver behind an HTTP proxy. A possible way to do this is to pass environment variables like https_proxy to the BSU CSI Driver containers. However, this is not supported today, and forces me to work around by patching the Chart.
Describe the solution you'd like in detail
Two enhancements could be done:

A generic way of overriding environment variables on the BSU CSI Driver (see extraEnv suggestion below).
Documenting the required environment variables to run the BSU CSI Driver behind a Proxy (https_proxy, no_proxy).

Additional context
Helm charts typically have knobs like extraEnv in the values.yaml to set static extra environment variables in the Deployments, StatefulSets, etc.
Some variables could contain secrets, and therefore often an extraSecretEnv is also offered, which manages a dedicated secret and its presentation.
Example overrides in a chart: https://github.com/hashicorp/vault-helm/blob/main/values.yaml#L511

@outscale-age
HTTP Proxy is now included in osc-bsu-csi charts

https://github.com/outscale/osc-bsu-csi-driver/pull/810


✨ Feature Request - Mobile Responsiveness & Enhanced Login/Signup

Is this feature request related to a problem with DevHub? Please describe.
The current login and signup pages are not responsive on mobile devices, limiting accessibility for users on smartphones. The signup process is currently restricted to username only, which could be improved by allowing email signups with OTP verification.
Describe the solution needed

Make both /login and /signup pages fully responsive for mobile devices.
Enhance the signup process to allow users to register using either their username or email address.
Implement an OTP verification system using a Python package to send emails for email-based signups.
Modify the login process to accept either "username or email id" along with "password".

Describe alternatives considered
Currently, users can only sign up with a username, which may not be ideal for everyone. An alternative could be allowing social media logins; however, this may complicate the user experience.
How will this feature improve DevHub?
These enhancements will significantly improve user experience by making it easier for students to access the platform on mobile devices and providing more flexible options for account creation and login.
Additional context
Consider looking into responsive design frameworks (like Bootstrap) and email verification libraries (like Flask-Mail for implementation.

Hi Abhishek,
I’ve been looking into the issue regarding the login and signup pages not being responsive and the enhancements for email signups with OTP verification. To ensure the changes are more manageable and can be tackled effectively, I would like to suggest breaking this issue into two separate tickets:

UI Responsiveness: An issue focused solely on making the /login and /signup pages fully responsive for mobile devices. This can include working with responsive design frameworks such as Bootstrap or media queries for optimal mobile layouts.
Signup Process Enhancement: A separate issue addressing the functionality changes, like allowing email-based signups, implementing OTP verification using a Python package like Flask-Mail, and modifying the login process to accept either a username or email.

This would help contributors focus on specific areas (UI vs. functionality) and allow for clearer testing and review of each component. Let me know your thoughts!
Cheers,
Jasmine Vo

well-thought-out suggestion! 👍 Breaking down the issue into separate UI and functionality components makes a lot of sense.

Issue further divided into https://github.com/devhub-ai/devhub/issues/34 and https://github.com/devhub-ai/devhub/issues/35
Closing this issue for now


Overhaul ImageBufAlgo API

We make four large changes across the board in ImageBufAlgo.

No more raw pointers.

All functions that take per-channel constants, or destinations for
per-channel outputs, in the form of (pointer, length) -- or worse, just
a pointer and an assumed length big enough to hold all channels -- are
being deprecated, in favor of passing span<>. This will let the IBA
function implementations check lengths and deal appropriately, also
makes it very easy for the caller to pass a single float that will be
understood to be replicated for all channels.

ImageBuf return results

All existing functions of the form
bool IBA::func (ImageBuf& result, ...input args...)

are getting an additional variant,
ImageBuf IBA::func (...input args...);

For most ordinary uses, this transforms the awkward
ImageBuf Result;
ImageBufAlgo::add (Result, A, B);

into the more compact and intuitive
ImageBuf Result = ImageBufAlgo::add (A, B);

Through the magic of C++11 "move" semantics (aka "rvalue assignment"),
this does not incur an unnecessary copy of the whole ImageBuf.
The old function forms will remain as first class citizens and are stil
useful in cases where you are repeatedly doing operations (so want to avoid
repeated allocation), or you want to use ROI's to write partial results of
the operation into a sub-region of an existing image.
This carries over to the Python API as well, where the old idiom
Result = ImageBuf()
ImageBufAlgo.add (Result, A, B)

was especially "non-Pythonic" looking, compared to
Result = ImageBufAlgo.add (A, B)

Reduce combinatorics of Image vs constant.

For some functions, such as mad(), which computes A*B+C, a whole bunch
of clutter is necessary to handle the various combinations of
image * image + image  ->  mad (const IB&, const IB&, const IB&)
image * const + image  ->  mad (const IB&, span<const float>, const IB&)
image * image + const  ->  mad (const IB&, const IB&, span<>)
const * image + const      ...
etc.

In fact, we need 7 variants (excluding const*const+const, which is not
useful because you don't know how big the resulting image would be).
These have all been replaced by a single variant,
mad (Image_or_Const A, Image_or_Const B, Image_or_Const C)

using a special new class just used for parameter passing,
Image_or_Const, which can "wrap" either an ImageBuf or a float or a
span, and let the implementation sort it all out
internally.  It really de-clutters the declarations! And it also forces
us to ensure in these cases that all the combinations are accounted for.

Some IBA functions that generate structs with data, such as compare(),
computePixelStats(), and histogram(), now directly return those structures
instead of needing them pre-declared and passed as reference paramters.
Thanks to the magic of C++11 'move' semantics, this is no longer expensive,
and it's a more intuitive way to structure the API. (The old versions of
the functions still are available, but are considered deprecated and will
be removed in future releases.)

In the process of these changes, I've done a substantial rewrite of both
the IBA and Python chapters of the docs, as well as all the verbose
comments in imagebufalgo.h itself that explains the functions.

I can try a test build if it would help but as the main consumer of OIIO on Fedora in Blender. Do you happen to know if it would be affected by this change?

A try would be welcome. It's always better to catch build problems in master rather than as we're preparing releases later.
I don't expect Blender to have any issues. I don't know that it uses ImageBufAlgo at all, and even if it does, I've tried to preserve (though informally deprecate) all of the old functions.

Looks like robin-map is a hard dependency? It's not in Fedora yet and the on-the-fly download failed, but builds aren't supposed to require internet when building anyway.

Does that mean that you also don't accept any projects whose build uses CMake's "ExternalProject_Add" feature? Would it be better (vis a vis "the rules") if the external dependencies were implemented as git submodules rather than explicit download?

I have started the packaging work for robin-map... I guess it's a good thing I checked out master so I'll be ready when 1.9 is fully released.
I tried building but it seem to accept me setting ROBINMAP_HOME_DIR or whatever it's called on the cmake command line. I was going to refactor it to look for tsl/robin_map.h first before resorting to a download. I'll do a pull request when I think it's complete.

OK, but my question still stands:
We have started using this idiom for directly downloading dependent packages that aren't widely (or at all) included in the usual distros, and to cover the cases where they aren't found (rather than failing a build), and to allow us to force a download and build of a specific version that's different (say, to test a new version ahead if its being in the OS distros, or different build flags).
Is this a bad idea, and we should switch now to relying on git submodule rather than either CMake ExternalProject_Add or rolling our own (as I did for the robinmap)? Or would that be equally problematic for you?

Network access is not allowed during official builds, so ironically a bundled copy would be preferred.
Currently it's using a brute force download instead of ExternalProject_Add and doesn't really give you a way of using a system installed version. Since I'm already touching it I was going to rework it to use ExternalProject_Add but that still only helps people doing personal builds.

The only reason it forces a download is because robinmap was such an obscure project that I assumed it wasn't in any distros.
We have a similar way of getting pybind11, but unless you "force" a download, it does the usual search of system libs to find it first (so, for many/most people, it doesn't need to download).
I'm trying to move away from "bundled" copies of anything. (Plus, depending on something to show up at build time, rather than be bundled into our project, makes a variety of versioning and licensing issues a lot easier to maintain.)
For now, let's just edit the parts of externalpackages.cmake to make robinmap more similar to how we handle pybind11 -- no download if it can be found on the system. And if you want to add this or any other dependent project to Fedora so that we never trigger build-time downloads, that's fine. In the long term, I'm still considering switching from explicit download to relying on git submodule, though that works fine for git-based projects and won't cover all bases if we have dependencies that aren't on git mirrors somewhere. Dunno if that makes anything easier for you or just pushes the headache around to a different spot.


[API -Migration] When migrating from APIM 1.8 to 2.00 it transfers the NULL values in GRANT_TYPES column

Description:
When migrating from APIM 1.8 to 2.0.0, The GRANT_TYPES column in IDN_OAUTH_CONSUMER_APPS fills with null values. When the user has not selected any grant types in APIM 1.8. It should be an empty string rather than a null value for GRANT_TYPES.

By @tmkasun from https://wso2.org/jira/browse/APIMANAGER-5685

Need to fix the migration client add the supported grant types in the identity.xml instead of null when migrating the GRANT_TYPES .

Closing Since the issue has been stale for a long time.


Routing Solver takes a long time compared to previous version when adding some constraint.

What version of OR-Tools and what language are you using?
Version: 9.6.2534
Language: Python
Which solver are you using (e.g. CP-SAT, Routing Solver, GLOP, BOP, Gurobi)
Routing Solver
What operating system (Linux, Windows, ...) and version?
Windows 11, Mac OS 13.3
What did you do?
I mix vrp_capacity.py and vrp_time_windows.py and add some constraint.
# [START program]
"""Capacited Vehicles Routing Problem (CVRP)."""

# [START import]
import sys
from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp
# [END import]

# [START data_model]
def create_data_model():
    """Stores the data for the problem."""
    data = {}
    data['distance_matrix'] = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [18324, 0, 23628, 21913, 1327, 1904, 22166, 22305, 22973, 21436, 23233, 24270, 23974, 22675, 22278, 19595, 22787, 22084, 22406, 22762, 22034, 8972, 7252, 7238, 8474, 8937, 6787, 6449, 7322, 4297, 3722, 3667, 3884, 22563, 4666, 8340, 10687, 11300, 5943, 8089, 7414, 4529, 3529, 2145, 1584, 5424, 5466, 4409, 4150, 1588, 2603, 22980, 7747, 24363, 22760, 3548, 4951, 4886, 7007, 100000, 100000],
        [14047, 24068, 0, 4325, 22716, 22985, 4465, 2741, 5227, 3798, 1064, 875, 760, 1494, 1874, 4905, 4043, 2520, 2389, 1535, 3290, 32318, 30599, 30584, 31559, 31096, 30105, 29768, 30641, 27480, 26905, 26850, 26954, 1498, 26827, 24791, 22215, 21602, 29290, 29178, 28503, 25682, 25889, 24490, 23287, 28612, 28654, 27597, 27338, 24775, 24942, 5079, 31094, 6431, 4544, 26736, 28134, 28074, 30353, 24068, 24068],
        [11399, 22049, 4355, 0, 20698, 20967, 535, 1495, 1924, 1133, 3182, 4549, 4639, 2894, 2571, 2245, 796, 1716, 2063, 2711, 1113, 30300, 28581, 28566, 29540, 29077, 28087, 27750, 28623, 25462, 24887, 24832, 24936, 3087, 24809, 22773, 20197, 19584, 27272, 27160, 26485, 23664, 23871, 22471, 21269, 26594, 26636, 25579, 25320, 22757, 22923, 1931, 29075, 3284, 1241, 24718, 26116, 26056, 28335, 22049, 22049],
        [17656, 1718, 22960, 21245, 0, 576, 21498, 21637, 22305, 20768, 22565, 23602, 23306, 22007, 21610, 18927, 22119, 21416, 21738, 22094, 21366, 9969, 8250, 8235, 9471, 9935, 7756, 7419, 8291, 5131, 4556, 4522, 4136, 21895, 4516, 8190, 10412, 11025, 6940, 8457, 7782, 4897, 3781, 2381, 1178, 6263, 6305, 5248, 4989, 2426, 2833, 22312, 8744, 23695, 22092, 4387, 5785, 5725, 8004, 1718, 1718],
        [17856, 2235, 23161, 21445, 657, 0, 21699, 21837, 22505, 20968, 22766, 23803, 23507, 22207, 21811, 19127, 22320, 21616, 21939, 22294, 21566, 10486, 8767, 8752, 9988, 10451, 8273, 7935, 8808, 5648, 5072, 4872, 4486, 22096, 4866, 8540, 10762, 11374, 7457, 8639, 7964, 5079, 3954, 2563, 1360, 6779, 6822, 5764, 5506, 2943, 3015, 22512, 9261, 23896, 22292, 4903, 6301, 6242, 8521, 2235, 2235],
        [10879, 21529, 4719, 680, 20178, 20447, 0, 1990, 2494, 1462, 3677, 4913, 5003, 3317, 2920, 1724, 1477, 2211, 2558, 3206, 1625, 29780, 28061, 28046, 29020, 28557, 27567, 27230, 28102, 24942, 24367, 24311, 24416, 3228, 24289, 22252, 19677, 19064, 26751, 26639, 25965, 23144, 23351, 21951, 20748, 26074, 26116, 25058, 24800, 22237, 22403, 2616, 28555, 3969, 1811, 24198, 25596, 25536, 27815, 21529, 21529],
        [12360, 22734, 2860, 1583, 21383, 21652, 1895, 0, 2486, 1086, 1687, 3053, 3144, 1399, 1076, 2996, 1302, 221, 568, 1215, 548, 30985, 29266, 29251, 30225, 29762, 28772, 28435, 29308, 26147, 25572, 25516, 25621, 1591, 25494, 23458, 20882, 20269, 27956, 27844, 27170, 24349, 24556, 23156, 21953, 27279, 27321, 26264, 26005, 23442, 23608, 2493, 29760, 3845, 1803, 25403, 26801, 26741, 29020, 22734, 22734],
        [12708, 23359, 5346, 1924, 22007, 22276, 2460, 2486, 0, 2779, 4173, 5539, 5630, 3885, 3562, 3787, 1184, 2707, 3054, 3702, 1937, 31609, 29890, 29875, 30850, 30386, 29396, 29059, 29932, 26771, 26196, 26141, 26245, 4078, 26118, 24082, 21506, 20893, 28581, 28469, 27794, 24973, 25180, 23781, 22578, 27903, 27945, 26888, 26629, 24066, 24232, 632, 30384, 2101, 683, 26027, 27425, 27365, 29644, 23359, 23359],
        [11857, 22144, 3808, 869, 20792, 21062, 1182, 948, 2561, 0, 2635, 4002, 4092, 2347, 2024, 2449, 1377, 1169, 1516, 2164, 623, 30395, 28676, 28661, 29635, 29172, 28182, 27844, 28717, 25557, 24981, 24926, 25030, 2540, 24904, 22867, 20292, 19679, 27366, 27254, 26580, 23758, 23966, 22566, 21363, 26688, 26731, 25673, 25415, 22852, 23018, 2568, 29170, 3920, 1877, 24812, 26210, 26151, 28430, 22144, 22144],
        [13492, 23793, 1309, 3260, 22441, 22711, 3401, 1676, 4163, 2733, 0, 1308, 1399, 591, 965, 4128, 2979, 1456, 1324, 471, 2225, 32044, 30325, 30310, 31284, 30821, 29831, 29493, 30366, 27206, 26630, 26575, 26679, 784, 26553, 24516, 21941, 21328, 29015, 28903, 28229, 25407, 25615, 24215, 23012, 28337, 28380, 27322, 27064, 24501, 24667, 4014, 30819, 5367, 3479, 26461, 27859, 27800, 30079, 23793, 23793],
        [14529, 24759, 875, 4518, 23407, 23676, 4659, 2935, 5421, 3991, 1258, 0, 390, 1688, 2068, 5165, 4237, 2714, 2582, 1729, 3483, 33009, 31290, 31275, 32250, 31786, 30796, 30459, 31332, 28171, 27596, 27541, 27645, 1743, 27518, 25482, 22906, 22293, 29981, 29869, 29194, 26373, 26580, 25181, 23978, 29303, 29345, 28288, 28029, 25466, 25632, 5272, 31784, 6625, 4738, 27427, 28825, 28765, 31044, 24759, 24759],
        [14393, 24414, 453, 4650, 23062, 23331, 4791, 3067, 5553, 4123, 1390, 390, 0, 1820, 2200, 5251, 4369, 2846, 2714, 1861, 3615, 32664, 30945, 30930, 31905, 31442, 30451, 30114, 30987, 27827, 27251, 27196, 27300, 1844, 27173, 25137, 22561, 21948, 29636, 29524, 28849, 26028, 26236, 24836, 23633, 28958, 29000, 27943, 27684, 25121, 25288, 5404, 31440, 6757, 4870, 27082, 28480, 28420, 30699, 24414, 24414],
        [12934, 23208, 1494, 2956, 21856, 22125, 3268, 1372, 3859, 2445, 591, 1688, 1778, 0, 396, 3570, 2675, 1151, 1036, 183, 1921, 31459, 29740, 29725, 30699, 30236, 29246, 28908, 29781, 26621, 26045, 25990, 26094, 192, 25968, 23931, 21356, 20743, 28430, 28318, 27644, 24822, 25030, 23630, 22427, 27752, 27795, 26737, 26479, 23916, 24082, 3726, 30234, 5079, 3175, 25876, 27274, 27215, 29494, 23208, 23208],
        [12537, 22867, 1863, 2560, 21516, 21785, 2872, 976, 3462, 2022, 988, 2057, 2147, 396, 0, 3173, 2278, 755, 743, 579, 1524, 31118, 29399, 29384, 30358, 29895, 28905, 28568, 29441, 26280, 25705, 25650, 25754, 572, 25627, 23591, 21015, 20402, 28090, 27978, 27303, 24482, 24689, 23289, 22087, 27412, 27454, 26397, 26138, 23575, 23741, 3469, 29893, 4822, 2779, 25536, 26934, 26874, 29153, 22867, 22867],
        [9364, 20014, 4971, 2735, 18663, 18932, 2989, 2996, 3796, 2170, 4128, 5165, 5255, 3570, 3173, 0, 3522, 3032, 3354, 3657, 2769, 28265, 26546, 26531, 27505, 27042, 26052, 25715, 26587, 23427, 22852, 22796, 22900, 3480, 22774, 20737, 18162, 17549, 25236, 25124, 24450, 21629, 21836, 20436, 19233, 24559, 24601, 23543, 23285, 20722, 20888, 3803, 27040, 5198, 3583, 22682, 24081, 24021, 26300, 20014, 20014],
        [12196, 22846, 4162, 796, 21495, 21764, 1332, 1302, 1184, 1595, 2989, 4355, 4446, 2701, 2378, 3042, 0, 1523, 1870, 2518, 753, 31097, 29378, 29363, 30337, 29874, 28884, 28547, 29420, 26259, 25684, 25629, 25733, 2894, 25606, 23570, 20994, 20381, 28069, 27957, 27282, 24461, 24668, 23268, 22065, 27391, 27433, 26376, 26117, 23554, 23720, 1191, 29872, 2543, 500, 25515, 26913, 26853, 29132, 22846, 22846],
        [12343, 22513, 2639, 1804, 21162, 21431, 2116, 221, 2707, 1307, 1466, 2832, 2923, 1178, 855, 2979, 1523, 0, 347, 994, 769, 30764, 29045, 29030, 30004, 29541, 28551, 28214, 29087, 25926, 25351, 25295, 25400, 1371, 25273, 23237, 20661, 20048, 27735, 27623, 26949, 24128, 24335, 22935, 21732, 27058, 27100, 26043, 25784, 23221, 23387, 2714, 29539, 4066, 2024, 25182, 26580, 26520, 28799, 22513, 22513],
        [12627, 22798, 2708, 2114, 21446, 21716, 2426, 530, 3016, 1617, 1501, 2902, 2992, 1213, 913, 3263, 1832, 309, 0, 1093, 1079, 31049, 29330, 29315, 30289, 29826, 28836, 28498, 29371, 26211, 25635, 25580, 25684, 1406, 25558, 23521, 20946, 20333, 28020, 27908, 27234, 24412, 24620, 23220, 22017, 27342, 27385, 26327, 26069, 23506, 23672, 2943, 29824, 4296, 2333, 25466, 26864, 26805, 29084, 22798, 22798],
        [13021, 23322, 1673, 2789, 21970, 22239, 2929, 1205, 3692, 2262, 471, 1867, 1957, 183, 579, 3657, 2507, 984, 883, 0, 1754, 31573, 29853, 29839, 30813, 30350, 29359, 29022, 29895, 26735, 26159, 26104, 26208, 376, 26082, 24045, 21469, 20857, 28544, 28432, 27758, 24936, 25144, 23744, 22541, 27866, 27908, 26851, 26592, 24030, 24196, 3699, 30348, 5051, 3008, 25990, 27388, 27328, 29608, 23322, 23322],
        [12176, 22463, 3408, 1148, 21112, 21381, 1460, 548, 1937, 841, 2235, 3602, 3692, 1947, 1624, 2769, 753, 769, 1116, 1764, 0, 30714, 28995, 28980, 29954, 29491, 28501, 28164, 29037, 25876, 25301, 25246, 25350, 2140, 25223, 23187, 20611, 19998, 27686, 27574, 26899, 24078, 24285, 22885, 21682, 27008, 27050, 25993, 25734, 23171, 23337, 1944, 29489, 3297, 1254, 25132, 26530, 26470, 28749, 22463, 22463],
        [24509, 9247, 32355, 30639, 10054, 10631, 30893, 31032, 31700, 30163, 31960, 32997, 32701, 31402, 31005, 28322, 31514, 30811, 31133, 31489, 30761, 0, 2720, 3756, 4669, 5008, 2336, 2717, 1800, 5634, 6554, 7048, 7344, 31290, 8507, 12181, 14859, 15472, 3365, 15818, 15215, 12511, 11674, 10354, 10180, 4544, 5142, 5587, 5103, 7662, 10747, 31707, 2206, 33090, 31487, 5705, 4981, 5392, 2713, 9247, 9247],
        [22265, 7336, 30630, 28914, 8329, 8929, 29168, 29307, 29975, 28437, 30235, 31272, 30976, 29676, 29280, 26597, 29789, 29086, 29408, 29764, 29036, 2720, 0, 1035, 1949, 2287, 2948, 3181, 2949, 3458, 4378, 4872, 5168, 29565, 6331, 9827, 12683, 13296, 2618, 14870, 14266, 11356, 10357, 9104, 8455, 4160, 4758, 5203, 4719, 6248, 9497, 29982, 633, 31365, 29762, 5040, 2805, 5008, 3177, 7336, 7336],
        [21677, 7356, 30649, 28934, 8348, 8949, 29187, 29326, 29994, 28457, 30254, 31291, 30995, 29696, 29299, 26616, 29809, 29105, 29427, 29783, 29055, 3870, 1150, 0, 1236, 1699, 3777, 3801, 3778, 3478, 4397, 4891, 5188, 29584, 6351, 9239, 12574, 12992, 3029, 14889, 14286, 11376, 10376, 9124, 8475, 4572, 5169, 5615, 5130, 6268, 9517, 30001, 1783, 31384, 29781, 5059, 2824, 5419, 4006, 7356, 7356],
        [20440, 8592, 30927, 29212, 9585, 10185, 29465, 29604, 30272, 28735, 30532, 31569, 31273, 29974, 29577, 26894, 30086, 29383, 29705, 30061, 29333, 4655, 1935, 1236, 0, 463, 5014, 5038, 5015, 4714, 5634, 6128, 6424, 29862, 6787, 8002, 11338, 11755, 4266, 16126, 15522, 12612, 11613, 10360, 9711, 5808, 6406, 6851, 6367, 7504, 10753, 30279, 2568, 31662, 30059, 6295, 4061, 6656, 5242, 8592, 8592],
        [19977, 9055, 30464, 28748, 10048, 10648, 29002, 29141, 29809, 28271, 30069, 31106, 30810, 29511, 29114, 26431, 29623, 28920, 29242, 29598, 28870, 4993, 2272, 1699, 463, 0, 5221, 5453, 5222, 5177, 6097, 6591, 6887, 29399, 6324, 7539, 10874, 11292, 4729, 16589, 15986, 13075, 12076, 10824, 10174, 6271, 6869, 7315, 6830, 7967, 11217, 29816, 2905, 31199, 29596, 6759, 4524, 7119, 5449, 9055, 9055],
        [23340, 7092, 30168, 28453, 7867, 8444, 28706, 28845, 29513, 27976, 29773, 30810, 30514, 29215, 28818, 26135, 29328, 28624, 28946, 29302, 28574, 2336, 2970, 3700, 4937, 5258, 0, 381, 535, 4465, 5385, 5879, 6175, 29103, 7338, 11012, 13690, 14303, 1128, 13482, 12878, 10175, 9337, 8017, 7919, 2208, 2806, 3251, 2767, 5326, 8410, 29520, 2456, 30903, 29300, 3369, 3812, 3056, 377, 7092, 7092],
        [23289, 6755, 29831, 28115, 7530, 8107, 28369, 28508, 29176, 27638, 29436, 30473, 30177, 28878, 28481, 25798, 28990, 28287, 28609, 28965, 28237, 2717, 3291, 4082, 5318, 5578, 381, 0, 917, 4415, 5335, 5828, 6125, 28766, 7288, 10962, 13640, 14252, 791, 13144, 12541, 9837, 9000, 7680, 7581, 1871, 2468, 2914, 2429, 4989, 8073, 29183, 2777, 30566, 28963, 3032, 3761, 2718, 40, 6755, 6755],
        [23664, 7628, 30704, 28988, 8403, 8980, 29242, 29381, 30049, 28511, 30309, 31346, 31050, 29751, 29354, 26671, 29863, 29160, 29482, 29838, 29110, 1800, 2536, 3571, 4485, 4823, 535, 917, 0, 4790, 5710, 6204, 6500, 29639, 7663, 11337, 14015, 14628, 1664, 14017, 13414, 10710, 9873, 8553, 8454, 2744, 3341, 3787, 3302, 5862, 8946, 30056, 2022, 31439, 29836, 3904, 4136, 3591, 913, 7628, 7628],
        [18874, 3877, 27506, 25790, 5205, 5470, 26044, 26183, 26851, 25313, 27111, 28148, 27852, 26553, 26156, 23473, 26665, 25962, 26284, 26640, 25912, 5608, 3480, 3466, 4702, 5165, 4571, 4150, 4571, 0, 919, 1413, 1709, 26441, 2873, 6547, 9224, 9837, 3378, 11866, 11292, 8407, 7407, 6023, 5462, 4837, 5405, 4917, 4658, 3795, 6480, 26858, 3869, 28241, 26638, 4056, 653, 5159, 4799, 3877, 3877],
        [17954, 3368, 26996, 25281, 4696, 4800, 25535, 25673, 26341, 24804, 26602, 27639, 27342, 26043, 25646, 22963, 26156, 25452, 25775, 26130, 25402, 6528, 4400, 4385, 5622, 6085, 5490, 5069, 5491, 919, 0, 493, 790, 25931, 1953, 5627, 8304, 8917, 4297, 11457, 10782, 7897, 6898, 5513, 4952, 5756, 6324, 5753, 5494, 3822, 5971, 26348, 4788, 27731, 26128, 4892, 1573, 6231, 5718, 3368, 3368],
        [17562, 3258, 26887, 25171, 4586, 4436, 25425, 25563, 26232, 24694, 26492, 27529, 27233, 25933, 25537, 22853, 26046, 25342, 25665, 26021, 25293, 7022, 4894, 4879, 6116, 6579, 5984, 5563, 5985, 1413, 493, 0, 397, 25822, 1561, 5235, 7912, 8525, 4791, 11347, 10673, 7787, 6788, 5404, 4842, 5833, 6401, 5673, 5414, 3741, 5861, 26239, 5282, 27622, 26019, 4812, 2067, 6150, 6212, 3258, 3258],
        [17164, 3717, 26449, 24734, 4645, 4582, 24988, 25126, 25794, 24257, 26054, 27091, 26795, 25496, 25099, 22416, 25609, 24905, 25228, 25583, 24855, 7318, 5190, 5175, 6412, 6875, 6280, 5860, 6281, 1709, 790, 677, 0, 25384, 1163, 4837, 7514, 8127, 5088, 11806, 11132, 8246, 7247, 5863, 5301, 6510, 7078, 6132, 5873, 4200, 6320, 25801, 5579, 27184, 25581, 5271, 2363, 6609, 6509, 3717, 3717],
        [12845, 23015, 1549, 3066, 21664, 21933, 3118, 1516, 4002, 2440, 784, 1743, 1833, 192, 572, 3480, 2818, 1295, 1229, 376, 2065, 31266, 29547, 29532, 30506, 30043, 29053, 28715, 29588, 26428, 25853, 25797, 25901, 0, 25775, 23738, 21163, 20550, 28237, 28125, 27451, 24630, 24837, 23437, 22234, 27560, 27602, 26544, 26286, 23723, 23889, 3919, 30041, 5271, 3319, 25683, 27081, 27022, 29301, 23015, 23015],
        [16001, 4285, 25875, 24160, 4901, 4838, 24414, 24552, 25220, 23683, 25480, 26517, 26221, 24922, 24525, 21842, 25035, 24331, 24654, 25009, 24281, 8481, 6353, 6339, 7154, 6690, 7444, 7023, 7444, 2873, 1953, 1658, 1163, 24810, 0, 3674, 6351, 6964, 6251, 12374, 11700, 8814, 7815, 6431, 5572, 7141, 7709, 6763, 6504, 4831, 6888, 25227, 6742, 26610, 25007, 5902, 3526, 7240, 7672, 4285, 4285],
        [14264, 8340, 24791, 22773, 8190, 8540, 22252, 23458, 24082, 22867, 24516, 25482, 25137, 23931, 23591, 20737, 23570, 23237, 23521, 24045, 23187, 12181, 9827, 9239, 8002, 7539, 11012, 10962, 11337, 6547, 5627, 5235, 4837, 23738, 3674, 0, 4245, 4858, 10171, 15935, 15261, 12239, 11187, 10029, 9235, 10827, 11243, 10409, 10214, 8416, 10480, 24098, 10361, 25481, 23816, 9611, 7200, 10950, 10944, 8340, 8340],
        [9965, 10378, 22164, 20448, 10743, 10680, 20702, 20840, 21508, 19971, 21769, 22806, 22510, 21210, 20814, 18130, 21323, 20619, 20942, 21297, 20569, 14967, 12839, 12312, 11076, 10613, 13929, 13508, 13930, 9358, 8438, 8169, 7722, 21099, 6531, 4245, 0, 612, 12736, 18467, 17793, 14907, 13908, 12524, 11415, 13652, 14220, 13274, 13015, 11212, 12981, 21515, 13227, 22899, 21295, 12413, 10012, 13751, 14157, 10378, 10378],
        [10210, 10991, 21551, 19835, 11356, 11293, 20089, 20227, 20895, 19358, 21156, 22193, 21897, 20597, 20201, 17517, 20710, 20006, 20329, 20685, 19957, 15580, 13452, 12925, 11689, 11226, 14542, 14121, 14543, 9971, 9051, 8782, 8335, 20486, 7144, 4858, 612, 0, 13349, 19080, 18406, 15520, 14521, 13137, 12027, 14265, 14833, 13886, 13628, 11825, 13594, 20902, 13840, 22286, 20683, 13025, 10625, 14364, 14770, 10991, 10991],
        [22498, 6206, 29314, 27598, 7013, 7590, 27852, 27991, 28659, 27122, 28919, 29956, 29660, 28361, 27964, 25281, 28473, 27770, 28092, 28448, 27720, 3445, 2555, 3041, 4277, 4740, 1109, 772, 1645, 3624, 4543, 5037, 5333, 28249, 6497, 10171, 12848, 13461, 0, 12816, 12212, 9509, 8671, 7351, 7139, 1542, 2140, 2585, 2101, 4660, 7744, 28666, 2721, 30049, 28446, 2703, 2970, 2390, 1246, 6206, 6206],
        [24650, 8480, 29976, 28260, 7940, 8242, 28514, 28653, 29321, 27783, 29581, 30618, 30322, 29023, 28626, 25943, 29135, 28432, 28754, 29110, 28382, 15947, 14824, 14809, 16046, 16509, 13472, 13135, 14008, 11893, 11317, 11262, 11479, 28911, 12261, 15935, 18283, 18896, 12915, 0, 674, 3713, 4747, 5906, 6894, 11979, 11576, 10435, 10705, 8991, 5454, 29328, 15319, 30711, 29108, 10103, 12546, 11442, 13979, 8480, 8480],
        [23976, 7805, 29301, 27586, 7265, 7567, 27839, 27978, 28646, 27109, 28906, 29943, 29647, 28348, 27951, 25268, 28461, 27757, 28080, 28435, 27707, 15407, 14150, 14135, 15371, 15835, 12933, 12596, 13469, 11218, 10643, 10588, 10805, 28236, 11586, 15261, 17608, 18221, 12376, 674, 0, 3039, 4073, 5232, 6220, 11440, 11036, 9896, 10166, 8317, 4780, 28653, 14644, 30036, 28433, 9564, 11872, 10902, 13439, 7805, 7805],
        [21187, 4784, 26491, 24776, 4244, 4546, 25029, 25168, 25836, 24299, 26096, 27133, 26837, 25538, 25141, 22458, 25651, 24947, 25269, 25625, 24897, 12395, 11129, 11114, 12350, 12813, 10069, 9732, 10605, 8197, 7622, 7566, 7784, 25426, 8565, 12239, 14587, 15200, 9376, 3817, 3143, 0, 1052, 2210, 3199, 8576, 8448, 7308, 7302, 5296, 1758, 25843, 11623, 27226, 25623, 6700, 8851, 8038, 10168, 4784, 4784],
        [20135, 3732, 25439, 23724, 3192, 3494, 23977, 24116, 24784, 23247, 25044, 26081, 25785, 24486, 24089, 21406, 24599, 23895, 24217, 24573, 23845, 11307, 10077, 10062, 11298, 11761, 8981, 8644, 9517, 7145, 6570, 6514, 6732, 24374, 7513, 11187, 13535, 14148, 8288, 5237, 4563, 1369, 0, 1158, 2147, 7488, 7643, 6332, 6214, 4244, 706, 24791, 10571, 26174, 24571, 5612, 7799, 6950, 9080, 3732, 3732],
        [18976, 2573, 24280, 22565, 2033, 2335, 22819, 22957, 23625, 22088, 23886, 24923, 24627, 23327, 22930, 20247, 23440, 22736, 23059, 23414, 22686, 10637, 8918, 8903, 10139, 10603, 8415, 8078, 8951, 5986, 5411, 5356, 5573, 23216, 6354, 10029, 12376, 12989, 7608, 6230, 5556, 2524, 1387, 0, 988, 6922, 6964, 5907, 5648, 3085, 451, 23632, 9412, 25015, 23412, 5046, 6640, 6384, 8672, 2573, 2573],
        [17988, 2090, 23292, 21577, 1045, 1347, 21830, 21969, 22637, 21100, 22897, 23934, 23638, 22339, 21942, 19259, 22452, 21748, 22070, 22426, 21698, 10154, 8435, 8420, 9657, 10120, 7932, 7595, 8468, 5503, 4928, 4873, 5090, 22227, 5561, 9235, 11457, 12070, 7126, 7278, 6604, 3718, 2589, 1202, 0, 6439, 6481, 5424, 5165, 2602, 1654, 22644, 8929, 24027, 22424, 4563, 6157, 5901, 8189, 2090, 2090],
        [23154, 5830, 28510, 26795, 6210, 6786, 27049, 27187, 27855, 26318, 28116, 29153, 28857, 27557, 27160, 24477, 27670, 26966, 27289, 27644, 26916, 4895, 4420, 4906, 6143, 6606, 2558, 2221, 3094, 4761, 5680, 6070, 6288, 27446, 7152, 10827, 13504, 14117, 1865, 11824, 11220, 8517, 7680, 6360, 6261, 0, 606, 1593, 1109, 3668, 6753, 27862, 4586, 29245, 27642, 1711, 4107, 856, 2657, 5830, 5830],
        [23570, 6091, 28771, 27055, 6470, 7047, 27309, 27448, 28116, 26578, 28376, 29413, 29117, 27818, 27421, 24738, 27930, 27227, 27549, 27905, 27177, 5163, 4689, 5175, 6412, 6875, 2827, 2490, 3363, 5177, 6097, 6487, 6704, 27706, 7569, 11243, 13921, 14534, 2134, 11606, 11003, 8554, 7940, 6620, 6521, 678, 0, 1854, 1369, 3929, 7013, 28123, 4855, 29506, 27903, 1972, 4524, 699, 2926, 6091, 6091],
        [22292, 4916, 27596, 25881, 5295, 5872, 26134, 26273, 26941, 25404, 27201, 28238, 27942, 26643, 26246, 23563, 26755, 26052, 26374, 26730, 26002, 5552, 5078, 5563, 6800, 7263, 3215, 2878, 3751, 4788, 5831, 5652, 5870, 26531, 6734, 10409, 13086, 13699, 2522, 10819, 10216, 7767, 6765, 5445, 5347, 1722, 1764, 0, 448, 2754, 5838, 26948, 5243, 28331, 26728, 797, 4135, 1184, 3314, 4916, 4916],
        [22097, 4721, 27401, 25686, 5100, 5677, 25939, 26078, 26746, 25209, 27006, 28043, 27747, 26448, 26051, 23368, 26560, 25857, 26179, 26535, 25807, 5103, 4629, 5114, 6351, 6814, 2767, 2429, 3302, 4593, 5636, 5457, 5675, 26336, 6539, 10214, 12891, 13504, 2073, 10714, 10111, 7407, 6570, 5250, 5152, 1273, 1316, 484, 0, 2559, 5643, 26753, 4795, 28136, 26533, 602, 3940, 736, 2866, 4721, 4721],
        [19537, 2162, 24842, 23126, 2541, 3118, 23380, 23518, 24187, 22649, 24447, 25484, 25188, 23888, 23492, 20808, 24001, 23297, 23620, 23976, 23248, 7655, 6059, 6044, 7281, 7744, 5329, 4992, 5865, 3810, 3838, 3660, 3877, 23777, 4742, 8416, 11038, 11651, 4636, 9063, 8379, 5493, 4494, 3110, 2592, 3836, 3878, 2821, 2562, 0, 3567, 24193, 6375, 25577, 23974, 1960, 3930, 3298, 5428, 2162, 2162],
        [19428, 3025, 24732, 23017, 2485, 2787, 23271, 23409, 24077, 22540, 24337, 25374, 25078, 23779, 23382, 20699, 23892, 23188, 23511, 23866, 23138, 11089, 9370, 9355, 10591, 11055, 8867, 8530, 9402, 6438, 5863, 5807, 6025, 23667, 6806, 10480, 12828, 13441, 8060, 5778, 5104, 2072, 935, 451, 1440, 7374, 7416, 6358, 6100, 3537, 0, 24084, 9864, 25467, 23864, 5497, 7092, 6836, 9124, 3025, 3025],
        [12724, 23374, 5353, 1931, 22023, 22292, 2467, 2493, 632, 2786, 4180, 5546, 5637, 3892, 3569, 3803, 1191, 2714, 3061, 3709, 1944, 31625, 29906, 29891, 30865, 30402, 29412, 29075, 29947, 26787, 26212, 26156, 26261, 4085, 26134, 24098, 21522, 20909, 28596, 28484, 27810, 24989, 25196, 23796, 22593, 27919, 27961, 26904, 26645, 24082, 24248, 0, 30400, 1352, 690, 26043, 27441, 27381, 29660, 23374, 23374],
        [22731, 7734, 31028, 29312, 8727, 9327, 29566, 29704, 30372, 28835, 30633, 31670, 31374, 30074, 29678, 26994, 30187, 29483, 29806, 30162, 29434, 2300, 534, 1569, 2483, 2822, 2529, 2761, 2530, 3856, 4776, 5270, 5566, 29963, 6729, 10361, 13081, 13694, 2848, 15268, 14664, 11754, 10755, 9502, 8853, 4391, 4988, 5351, 4866, 6646, 9895, 30379, 0, 31763, 30160, 5403, 3203, 5238, 2757, 7734, 7734],
        [13717, 24757, 6667, 3245, 23406, 23675, 3781, 3807, 1946, 4100, 5494, 6860, 6951, 5206, 4883, 5117, 2505, 4028, 4375, 5023, 3258, 33008, 31289, 31274, 32248, 31785, 30795, 30458, 31331, 28170, 27595, 27540, 27644, 5399, 27517, 25481, 22905, 22292, 29980, 29868, 29193, 26372, 26579, 25179, 23976, 29302, 29344, 28287, 28028, 25465, 25631, 1314, 31783, 0, 2004, 27426, 28824, 28764, 31043, 24757, 24757],
        [12442, 23092, 4663, 1241, 21741, 22010, 1777, 1803, 683, 2095, 3490, 4856, 4947, 3202, 2879, 3486, 500, 2024, 2371, 3018, 1254, 31343, 29624, 29609, 30584, 30120, 29130, 28793, 29666, 26505, 25930, 25875, 25979, 3394, 25852, 23816, 21240, 20627, 28315, 28203, 27528, 24707, 24914, 23514, 22312, 27637, 27679, 26622, 26363, 23800, 23966, 690, 30118, 2042, 0, 25761, 27159, 27099, 29378, 23092, 23092],
        [21495, 4119, 26799, 25083, 4498, 5075, 25337, 25476, 26144, 24606, 26404, 27441, 27145, 25846, 25449, 22766, 25958, 25255, 25577, 25933, 25205, 5694, 4729, 5081, 6318, 6781, 3369, 3032, 3904, 3991, 5034, 4855, 5072, 25734, 5937, 9611, 12289, 12902, 2676, 10214, 9610, 6907, 6070, 4750, 4549, 1876, 1918, 861, 602, 1957, 5143, 26151, 4895, 27534, 25931, 0, 3338, 1338, 3468, 4119, 4119],
        [19527, 4531, 28160, 26444, 5859, 6124, 26698, 26836, 27504, 25967, 27765, 28802, 28506, 27206, 26810, 24126, 27319, 26615, 26938, 27293, 26565, 4955, 2827, 2812, 4049, 4512, 3917, 3496, 3918, 653, 1573, 2067, 2363, 27095, 3526, 7200, 9878, 10491, 2724, 12519, 11946, 9060, 8061, 6676, 6115, 4206, 4774, 4286, 4028, 4448, 7134, 27511, 3215, 28895, 27291, 3425, 0, 4528, 4145, 4531, 4531],
        [22833, 5457, 28137, 26422, 5836, 6413, 26675, 26814, 27482, 25945, 27742, 28779, 28483, 27184, 26787, 24104, 27297, 26593, 26915, 27271, 26543, 5396, 4921, 5407, 6644, 7107, 3059, 2722, 3595, 5072, 5992, 6194, 6411, 27072, 7276, 10950, 13627, 14240, 2366, 11451, 10847, 8144, 7306, 5986, 5888, 1031, 699, 1220, 736, 3295, 6379, 27489, 5087, 28872, 27269, 1338, 4419, 0, 3158, 5457, 5457],
        [23271, 6736, 29813, 28097, 7512, 8088, 28351, 28489, 29157, 27620, 29418, 30455, 30159, 28859, 28463, 25779, 28972, 28268, 28591, 28946, 28218, 3997, 3328, 3814, 5050, 5513, 1660, 1423, 2196, 4397, 5316, 5810, 6106, 28748, 7270, 10944, 13621, 14234, 773, 13126, 12523, 9819, 8982, 7662, 7563, 1852, 2450, 2895, 2411, 4970, 8055, 29164, 3494, 30548, 28944, 3013, 3743, 2700, 0, 6736, 6736],
        [18324, 100000, 23628, 21913, 1327, 1904, 22166, 22305, 22973, 21436, 23233, 24270, 23974, 22675, 22278, 19595, 22787, 22084, 22406, 22762, 22034, 8972, 7252, 7238, 8474, 8937, 6787, 6449, 7322, 4297, 3722, 3667, 3884, 22563, 4666, 8340, 10687, 11300, 5943, 8089, 7414, 4529, 3529, 2145, 1584, 5424, 5466, 4409, 4150, 1588, 2603, 22980, 7747, 24363, 22760, 3548, 4951, 4886, 7007, 0, 100000],
        [18324, 100000, 23628, 21913, 1327, 1904, 22166, 22305, 22973, 21436, 23233, 24270, 23974, 22675, 22278, 19595, 22787, 22084, 22406, 22762, 22034, 8972, 7252, 7238, 8474, 8937, 6787, 6449, 7322, 4297, 3722, 3667, 3884, 22563, 4666, 8340, 10687, 11300, 5943, 8089, 7414, 4529, 3529, 2145, 1584, 5424, 5466, 4409, 4150, 1588, 2603, 22980, 7747, 24363, 22760, 3548, 4951, 4886, 7007, 100000, 0]
    ]
    data['time_matrix'] = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [25, 0, 30, 29, 6, 7, 29, 29, 30, 28, 30, 31, 31, 29, 29, 26, 29, 29, 29, 29, 29, 15, 13, 13, 14, 15, 12, 12, 13, 9, 9, 9, 9, 29, 10, 14, 16, 17, 11, 13, 13, 10, 9, 7, 6, 11, 11, 9, 9, 6, 7, 30, 13, 31, 30, 8, 10, 10, 13, 40, 40],
        [20, 31, 0, 10, 30, 30, 10, 8, 10, 9, 6, 5, 5, 6, 7, 10, 9, 7, 7, 6, 8, 40, 38, 38, 39, 39, 38, 37, 38, 35, 34, 34, 34, 6, 34, 32, 29, 28, 37, 37, 36, 33, 33, 32, 30, 36, 36, 35, 35, 32, 32, 10, 39, 12, 10, 34, 35, 35, 38, 31, 31],
        [15, 27, 8, 0, 25, 26, 3, 4, 5, 4, 6, 8, 8, 6, 6, 5, 3, 5, 5, 6, 4, 36, 34, 34, 35, 35, 33, 33, 34, 30, 30, 30, 30, 6, 30, 28, 25, 24, 32, 32, 32, 29, 29, 27, 26, 32, 32, 31, 30, 27, 28, 5, 35, 6, 4, 30, 31, 31, 34, 27, 27],
        [22, 5, 28, 26, 0, 3, 27, 26, 27, 25, 27, 29, 28, 27, 26, 23, 27, 26, 27, 27, 26, 14, 12, 12, 13, 14, 11, 11, 12, 8, 8, 8, 7, 27, 7, 12, 14, 15, 10, 12, 11, 8, 7, 5, 4, 10, 10, 8, 8, 5, 6, 27, 12, 29, 27, 7, 9, 9, 12, 5, 5],
        [23, 5, 28, 26, 3, 0, 27, 27, 28, 26, 28, 29, 28, 27, 27, 24, 27, 26, 27, 27, 26, 14, 12, 12, 14, 14, 12, 11, 12, 9, 8, 8, 8, 27, 8, 12, 14, 15, 11, 12, 12, 8, 7, 6, 4, 10, 10, 9, 9, 6, 6, 27, 13, 29, 27, 8, 9, 10, 12, 5, 5],
        [14, 25, 7, 2, 24, 24, 0, 4, 4, 3, 6, 7, 7, 5, 5, 4, 3, 4, 5, 5, 4, 34, 33, 32, 34, 33, 32, 32, 32, 29, 28, 28, 28, 5, 28, 26, 23, 22, 31, 31, 30, 27, 28, 26, 24, 30, 30, 29, 29, 26, 26, 4, 33, 6, 4, 28, 30, 30, 32, 25, 25],
        [16, 26, 5, 3, 25, 26, 4, 0, 4, 3, 3, 5, 5, 3, 3, 5, 3, 2, 2, 3, 2, 35, 34, 34, 35, 34, 33, 33, 34, 30, 30, 30, 30, 3, 30, 27, 24, 24, 32, 32, 31, 28, 29, 27, 26, 32, 32, 30, 30, 27, 28, 4, 34, 6, 3, 29, 31, 31, 34, 26, 26],
        [16, 27, 7, 4, 26, 26, 4, 4, 0, 5, 6, 8, 8, 6, 6, 6, 3, 4, 5, 6, 4, 36, 35, 34, 36, 35, 34, 34, 34, 31, 30, 30, 30, 6, 30, 28, 25, 24, 33, 33, 32, 29, 30, 28, 26, 32, 32, 31, 31, 28, 28, 2, 35, 4, 2, 30, 32, 32, 34, 27, 27],
        [15, 26, 6, 3, 25, 25, 3, 3, 4, 0, 5, 6, 6, 4, 4, 4, 3, 3, 3, 4, 2, 35, 33, 33, 34, 34, 33, 32, 33, 30, 29, 29, 29, 4, 29, 27, 24, 23, 32, 32, 31, 28, 28, 27, 25, 31, 31, 30, 30, 27, 27, 4, 34, 6, 4, 29, 30, 30, 33, 26, 26],
        [17, 28, 3, 5, 26, 27, 6, 3, 6, 5, 0, 3, 3, 2, 3, 6, 5, 3, 3, 2, 4, 37, 35, 35, 36, 35, 34, 34, 35, 31, 31, 31, 31, 2, 31, 28, 26, 25, 33, 33, 33, 30, 30, 28, 27, 33, 33, 32, 31, 28, 29, 6, 36, 8, 5, 31, 32, 32, 35, 28, 28],
        [18, 29, 3, 7, 27, 28, 7, 5, 8, 6, 3, 0, 2, 3, 4, 7, 6, 5, 5, 3, 5, 38, 36, 36, 37, 37, 35, 35, 36, 33, 32, 32, 32, 3, 32, 30, 27, 26, 35, 35, 34, 31, 31, 29, 28, 34, 34, 33, 32, 30, 30, 7, 37, 9, 7, 32, 33, 33, 36, 29, 29],
        [18, 28, 2, 7, 27, 27, 7, 5, 8, 6, 3, 2, 0, 4, 4, 7, 6, 5, 5, 4, 6, 37, 36, 36, 37, 36, 35, 35, 35, 32, 31, 31, 31, 4, 31, 29, 26, 26, 34, 34, 33, 30, 31, 29, 28, 33, 33, 32, 32, 29, 29, 8, 36, 9, 7, 31, 33, 33, 35, 28, 28],
        [17, 28, 4, 6, 27, 27, 6, 4, 7, 5, 3, 4, 5, 0, 3, 6, 5, 4, 4, 3, 5, 37, 35, 35, 36, 36, 35, 34, 35, 32, 31, 31, 31, 3, 31, 29, 26, 25, 34, 34, 33, 30, 30, 29, 27, 33, 33, 32, 32, 29, 29, 7, 36, 8, 6, 31, 33, 33, 35, 28, 28],
        [16, 27, 4, 4, 25, 26, 5, 3, 5, 4, 3, 4, 4, 2, 0, 5, 4, 2, 3, 2, 3, 36, 34, 34, 35, 34, 33, 33, 34, 30, 30, 30, 30, 2, 30, 27, 25, 24, 32, 32, 32, 29, 29, 27, 26, 32, 32, 31, 30, 27, 28, 5, 34, 7, 5, 30, 31, 31, 34, 27, 27],
        [12, 24, 7, 5, 22, 23, 5, 5, 6, 4, 6, 7, 7, 5, 5, 0, 5, 5, 5, 6, 5, 33, 31, 31, 32, 31, 30, 30, 31, 27, 27, 27, 27, 5, 27, 24, 21, 21, 29, 29, 29, 25, 26, 24, 23, 29, 29, 27, 27, 24, 25, 6, 31, 7, 6, 26, 28, 28, 31, 24, 24],
        [15, 27, 6, 2, 25, 26, 3, 3, 3, 3, 5, 6, 7, 5, 4, 5, 0, 3, 4, 4, 2, 36, 34, 34, 35, 34, 33, 33, 34, 30, 30, 30, 30, 5, 30, 27, 25, 24, 32, 32, 32, 29, 29, 27, 26, 32, 32, 31, 30, 27, 28, 3, 35, 5, 2, 30, 31, 31, 34, 27, 27],
        [15, 26, 5, 4, 25, 25, 4, 2, 4, 3, 3, 5, 5, 3, 3, 5, 3, 0, 2, 3, 2, 35, 34, 33, 35, 34, 33, 33, 33, 30, 29, 29, 29, 3, 29, 27, 24, 23, 32, 32, 31, 28, 29, 27, 25, 31, 31, 30, 30, 27, 27, 4, 34, 6, 4, 29, 31, 31, 33, 26, 26],
        [16, 27, 5, 4, 25, 26, 5, 2, 5, 4, 3, 5, 5, 3, 3, 5, 4, 2, 0, 3, 3, 36, 34, 34, 35, 35, 33, 33, 34, 30, 30, 30, 30, 3, 30, 28, 25, 24, 32, 32, 32, 29, 29, 27, 26, 32, 32, 31, 30, 27, 28, 5, 35, 7, 4, 30, 31, 31, 34, 27, 27],
        [16, 27, 3, 5, 26, 26, 5, 3, 6, 4, 2, 4, 4, 2, 2, 6, 4, 3, 3, 0, 3, 36, 35, 34, 35, 35, 34, 33, 34, 31, 30, 30, 30, 2, 30, 28, 25, 24, 33, 33, 32, 29, 30, 28, 26, 32, 32, 31, 31, 28, 28, 6, 35, 7, 5, 30, 32, 32, 34, 27, 27],
        [15, 26, 5, 3, 25, 25, 3, 2, 4, 3, 4, 6, 6, 4, 3, 5, 2, 2, 3, 3, 0, 35, 34, 33, 34, 34, 33, 32, 33, 30, 29, 29, 29, 4, 29, 27, 24, 23, 32, 32, 31, 28, 29, 27, 25, 31, 31, 30, 30, 27, 27, 4, 34, 5, 3, 29, 31, 31, 33, 26, 26],
        [28, 12, 37, 35, 13, 13, 36, 35, 36, 34, 36, 38, 37, 36, 35, 32, 36, 35, 36, 36, 35, 0, 4, 6, 7, 7, 4, 5, 4, 8, 9, 9, 10, 36, 11, 15, 18, 19, 5, 19, 19, 16, 15, 13, 13, 7, 7, 8, 7, 10, 14, 36, 4, 38, 36, 8, 7, 8, 5, 12, 12],
        [26, 10, 35, 34, 11, 12, 34, 34, 35, 33, 35, 36, 36, 34, 34, 31, 34, 33, 34, 34, 34, 4, 0, 3, 4, 4, 5, 5, 5, 5, 6, 7, 7, 34, 9, 12, 16, 16, 5, 18, 17, 14, 13, 12, 11, 6, 7, 8, 7, 9, 12, 35, 2, 36, 34, 7, 5, 7, 5, 10, 10],
        [25, 10, 35, 33, 11, 11, 34, 34, 35, 33, 35, 36, 35, 34, 34, 31, 34, 33, 34, 34, 33, 6, 3, 0, 3, 3, 6, 6, 6, 5, 6, 7, 7, 34, 8, 12, 15, 16, 5, 18, 17, 14, 13, 12, 11, 7, 7, 8, 7, 9, 12, 34, 4, 36, 34, 7, 5, 8, 6, 10, 10],
        [24, 11, 36, 34, 12, 13, 34, 34, 35, 33, 35, 36, 36, 35, 34, 31, 35, 34, 34, 35, 34, 7, 4, 3, 0, 2, 7, 7, 7, 7, 8, 8, 9, 34, 9, 10, 14, 14, 6, 19, 19, 16, 15, 13, 12, 8, 9, 9, 9, 10, 13, 35, 5, 37, 35, 8, 6, 9, 7, 11, 11],
        [24, 11, 35, 33, 13, 13, 34, 34, 35, 33, 35, 36, 35, 34, 34, 31, 34, 33, 34, 34, 33, 7, 4, 3, 2, 0, 7, 8, 7, 7, 8, 9, 9, 34, 8, 10, 13, 14, 7, 20, 19, 16, 15, 14, 13, 9, 9, 10, 9, 10, 14, 34, 5, 36, 34, 9, 6, 10, 8, 11, 11],
        [27, 9, 35, 33, 10, 11, 33, 33, 34, 32, 34, 35, 35, 33, 33, 30, 34, 33, 33, 34, 33, 4, 5, 6, 7, 7, 0, 2, 2, 6, 7, 8, 8, 33, 10, 14, 17, 17, 3, 17, 16, 13, 12, 10, 10, 4, 5, 5, 5, 7, 11, 34, 4, 35, 34, 5, 6, 5, 2, 9, 9],
        [28, 9, 34, 33, 10, 11, 33, 33, 34, 32, 34, 35, 35, 33, 33, 30, 33, 32, 33, 33, 33, 5, 5, 6, 7, 8, 2, 0, 3, 7, 8, 8, 9, 33, 10, 14, 17, 18, 3, 16, 16, 13, 12, 10, 10, 4, 4, 5, 4, 7, 11, 34, 5, 35, 33, 5, 6, 5, 2, 9, 9],
        [29, 11, 36, 34, 12, 13, 35, 35, 35, 34, 36, 37, 36, 35, 35, 32, 35, 34, 35, 35, 34, 5, 5, 7, 8, 8, 3, 4, 0, 8, 9, 9, 10, 35, 11, 15, 18, 19, 4, 18, 17, 15, 14, 12, 12, 6, 6, 7, 6, 9, 12, 35, 5, 37, 35, 7, 7, 7, 4, 11, 11],
        [22, 6, 32, 30, 7, 8, 30, 30, 31, 29, 31, 32, 32, 31, 30, 27, 31, 30, 30, 31, 30, 8, 5, 5, 7, 7, 7, 7, 7, 0, 2, 3, 3, 30, 5, 9, 12, 12, 6, 15, 14, 11, 10, 8, 8, 7, 8, 7, 7, 6, 9, 31, 6, 33, 31, 6, 2, 8, 7, 6, 6],
        [21, 5, 31, 29, 7, 7, 30, 30, 31, 29, 31, 32, 31, 30, 30, 27, 30, 29, 30, 30, 29, 9, 6, 6, 8, 8, 8, 8, 8, 2, 0, 2, 2, 30, 4, 8, 11, 11, 7, 14, 14, 10, 9, 8, 7, 8, 9, 8, 8, 6, 8, 30, 7, 32, 30, 7, 3, 9, 8, 5, 5],
        [21, 5, 31, 29, 7, 7, 30, 29, 30, 28, 30, 32, 31, 30, 29, 26, 30, 29, 30, 30, 29, 9, 7, 7, 8, 9, 8, 8, 8, 3, 2, 0, 2, 30, 3, 8, 10, 11, 7, 14, 13, 10, 9, 8, 7, 8, 9, 8, 7, 6, 8, 30, 8, 32, 30, 7, 4, 8, 9, 5, 5],
        [20, 6, 31, 29, 7, 7, 29, 29, 30, 28, 30, 31, 31, 29, 29, 26, 30, 29, 29, 30, 29, 10, 7, 7, 8, 9, 8, 8, 8, 3, 2, 2, 0, 29, 3, 7, 10, 10, 7, 15, 14, 11, 10, 8, 7, 9, 9, 8, 8, 6, 9, 30, 8, 31, 30, 7, 4, 9, 9, 6, 6],
        [16, 27, 3, 5, 25, 26, 5, 3, 6, 4, 2, 3, 4, 2, 2, 5, 5, 3, 3, 2, 4, 36, 34, 34, 35, 35, 33, 33, 34, 31, 30, 30, 30, 0, 30, 28, 25, 24, 33, 33, 32, 29, 29, 28, 26, 32, 32, 31, 30, 28, 28, 6, 35, 8, 5, 30, 31, 31, 34, 27, 27],
        [19, 6, 30, 28, 7, 7, 29, 29, 29, 28, 30, 31, 30, 29, 29, 26, 29, 28, 29, 29, 28, 11, 9, 8, 10, 9, 10, 10, 10, 5, 4, 3, 3, 29, 0, 6, 9, 9, 9, 15, 14, 11, 10, 9, 8, 9, 10, 9, 9, 7, 9, 29, 9, 31, 29, 8, 5, 10, 10, 6, 6],
        [17, 11, 29, 27, 11, 11, 26, 27, 28, 27, 28, 30, 29, 28, 27, 24, 27, 27, 28, 28, 27, 15, 12, 12, 10, 10, 14, 14, 14, 9, 8, 8, 7, 28, 6, 0, 6, 7, 13, 19, 18, 15, 14, 13, 12, 14, 14, 13, 13, 11, 13, 28, 13, 30, 28, 12, 10, 14, 14, 11, 11],
        [13, 13, 26, 24, 14, 14, 24, 24, 25, 23, 25, 26, 26, 25, 24, 21, 25, 24, 25, 25, 24, 18, 16, 15, 14, 13, 17, 17, 17, 12, 11, 11, 10, 25, 9, 6, 0, 2, 16, 22, 21, 18, 17, 15, 14, 17, 17, 16, 16, 14, 16, 25, 16, 27, 25, 15, 13, 17, 17, 13, 13],
        [13, 14, 25, 24, 14, 14, 24, 24, 25, 23, 25, 26, 25, 24, 24, 21, 24, 23, 24, 24, 23, 19, 16, 16, 15, 14, 18, 18, 17, 12, 11, 11, 11, 24, 10, 7, 2, 0, 17, 23, 22, 19, 18, 16, 15, 17, 18, 17, 16, 15, 17, 24, 17, 26, 24, 16, 13, 17, 18, 14, 14],
        [26, 9, 34, 32, 9, 10, 32, 32, 33, 31, 33, 34, 34, 33, 32, 29, 33, 32, 32, 33, 32, 5, 4, 5, 6, 7, 3, 2, 3, 6, 7, 7, 8, 33, 9, 13, 16, 17, 0, 16, 15, 12, 11, 10, 10, 3, 4, 4, 4, 7, 10, 33, 5, 35, 33, 5, 5, 4, 3, 9, 9],
        [29, 11, 34, 33, 10, 11, 33, 33, 34, 32, 34, 35, 35, 33, 33, 30, 33, 33, 33, 33, 33, 19, 18, 18, 19, 20, 17, 16, 17, 15, 14, 14, 14, 33, 15, 19, 22, 22, 16, 0, 2, 6, 7, 8, 9, 15, 15, 13, 14, 11, 7, 34, 18, 35, 34, 13, 15, 15, 17, 11, 11],
        [28, 10, 34, 32, 10, 10, 32, 32, 33, 31, 33, 34, 34, 33, 32, 29, 33, 32, 32, 33, 32, 18, 17, 17, 18, 19, 16, 16, 17, 14, 13, 13, 13, 32, 14, 18, 21, 21, 15, 2, 0, 5, 6, 7, 8, 15, 14, 13, 13, 11, 7, 33, 18, 35, 33, 12, 15, 14, 17, 10, 10],
        [25, 7, 31, 29, 6, 7, 29, 29, 30, 28, 30, 31, 31, 29, 29, 26, 30, 29, 29, 30, 29, 15, 14, 14, 15, 16, 13, 13, 13, 11, 10, 10, 10, 29, 11, 15, 18, 18, 12, 6, 5, 0, 3, 4, 5, 11, 11, 10, 10, 7, 3, 30, 14, 31, 30, 9, 11, 11, 13, 7, 7],
        [24, 6, 29, 28, 5, 5, 28, 28, 29, 27, 29, 30, 30, 28, 28, 25, 28, 28, 28, 28, 28, 14, 13, 13, 14, 14, 12, 11, 12, 9, 9, 9, 9, 28, 10, 14, 16, 17, 11, 8, 7, 3, 0, 3, 4, 10, 10, 9, 9, 6, 2, 29, 13, 30, 29, 8, 10, 10, 12, 6, 6],
        [23, 4, 28, 26, 4, 4, 27, 27, 27, 26, 28, 29, 28, 27, 27, 24, 27, 26, 27, 27, 26, 13, 11, 11, 13, 13, 11, 10, 11, 8, 8, 7, 8, 27, 8, 13, 15, 16, 10, 9, 8, 5, 3, 0, 3, 9, 9, 8, 8, 5, 2, 27, 12, 29, 27, 7, 9, 9, 11, 4, 4],
        [22, 4, 27, 25, 3, 3, 26, 25, 26, 25, 27, 28, 27, 26, 25, 23, 26, 25, 26, 26, 25, 13, 11, 11, 12, 13, 10, 10, 11, 8, 7, 7, 7, 26, 8, 12, 14, 15, 9, 10, 9, 6, 5, 3, 0, 9, 9, 8, 7, 4, 3, 26, 11, 28, 26, 7, 8, 8, 11, 4, 4],
        [27, 8, 33, 31, 9, 9, 32, 31, 32, 31, 32, 34, 33, 32, 31, 28, 32, 31, 32, 32, 31, 7, 7, 7, 9, 9, 5, 4, 5, 7, 8, 9, 9, 32, 10, 14, 17, 17, 4, 15, 14, 11, 10, 9, 9, 0, 2, 4, 3, 6, 9, 32, 7, 34, 32, 4, 7, 3, 5, 8, 8],
        [28, 8, 33, 31, 9, 9, 32, 31, 32, 31, 33, 34, 33, 32, 31, 29, 32, 31, 32, 32, 31, 7, 7, 7, 9, 9, 5, 4, 5, 8, 9, 9, 9, 32, 10, 14, 17, 18, 4, 14, 14, 11, 11, 9, 9, 2, 0, 4, 3, 6, 9, 32, 7, 34, 32, 4, 7, 2, 5, 8, 8],
        [26, 7, 32, 30, 7, 8, 30, 30, 31, 29, 31, 32, 32, 31, 30, 27, 31, 30, 30, 31, 30, 8, 7, 8, 9, 10, 5, 5, 6, 7, 8, 8, 8, 31, 9, 13, 16, 17, 4, 13, 13, 10, 9, 8, 7, 4, 4, 0, 2, 5, 8, 31, 8, 33, 31, 2, 6, 3, 6, 7, 7],
        [27, 8, 32, 31, 8, 9, 31, 31, 32, 30, 32, 33, 33, 31, 31, 28, 32, 31, 31, 31, 31, 8, 8, 8, 10, 10, 6, 5, 6, 8, 9, 9, 9, 31, 10, 14, 17, 17, 5, 15, 14, 11, 10, 8, 8, 4, 4, 3, 0, 5, 9, 32, 8, 33, 32, 3, 7, 3, 6, 8, 8],
        [23, 4, 29, 27, 4, 5, 27, 27, 28, 26, 28, 29, 29, 28, 27, 24, 28, 27, 27, 28, 27, 10, 8, 8, 10, 10, 7, 7, 8, 6, 6, 6, 6, 28, 7, 11, 14, 14, 7, 12, 11, 8, 7, 5, 4, 6, 6, 5, 4, 0, 6, 28, 9, 30, 28, 4, 6, 5, 8, 4, 4],
        [23, 5, 29, 27, 4, 5, 27, 27, 28, 26, 28, 29, 29, 27, 27, 24, 28, 27, 27, 28, 27, 14, 12, 12, 13, 14, 11, 11, 12, 9, 8, 8, 8, 27, 9, 13, 16, 16, 10, 8, 7, 4, 3, 2, 3, 10, 10, 9, 8, 5, 0, 28, 12, 30, 28, 8, 9, 9, 12, 5, 5],
        [18, 29, 9, 6, 28, 28, 6, 6, 4, 7, 8, 10, 10, 8, 8, 8, 5, 6, 7, 8, 6, 38, 37, 36, 38, 37, 36, 36, 36, 33, 32, 32, 32, 8, 32, 30, 27, 26, 35, 35, 34, 31, 32, 30, 28, 34, 34, 33, 33, 30, 30, 0, 37, 5, 4, 32, 34, 34, 36, 29, 29],
        [27, 10, 36, 34, 11, 12, 34, 34, 35, 33, 35, 36, 36, 35, 34, 31, 35, 34, 34, 35, 34, 4, 2, 3, 4, 5, 5, 5, 4, 6, 7, 7, 8, 35, 9, 13, 16, 17, 5, 19, 18, 15, 14, 12, 12, 7, 7, 8, 7, 9, 13, 35, 0, 37, 35, 8, 5, 8, 5, 10, 10],
        [19, 31, 11, 7, 29, 30, 8, 8, 6, 8, 10, 11, 11, 9, 9, 9, 6, 8, 9, 9, 7, 40, 38, 38, 39, 39, 37, 37, 38, 35, 34, 34, 34, 10, 34, 32, 29, 28, 37, 37, 36, 33, 33, 31, 30, 36, 36, 35, 34, 32, 32, 5, 39, 0, 6, 34, 35, 35, 38, 31, 31],
        [16, 27, 7, 3, 26, 26, 4, 3, 2, 4, 5, 7, 7, 5, 5, 5, 2, 4, 4, 5, 3, 36, 34, 34, 35, 35, 34, 33, 34, 31, 30, 30, 30, 5, 30, 28, 25, 24, 33, 33, 32, 29, 29, 28, 26, 32, 32, 31, 31, 28, 28, 2, 35, 4, 0, 30, 32, 32, 34, 27, 27],
        [25, 6, 31, 29, 7, 7, 29, 29, 30, 28, 30, 31, 31, 30, 29, 26, 30, 29, 30, 30, 29, 8, 7, 7, 9, 9, 5, 5, 6, 6, 7, 7, 7, 30, 8, 12, 15, 16, 4, 13, 12, 9, 9, 7, 7, 4, 4, 3, 2, 4, 7, 30, 7, 32, 30, 0, 5, 3, 6, 6, 6],
        [23, 6, 32, 31, 8, 8, 31, 31, 32, 30, 32, 33, 33, 31, 31, 28, 31, 31, 31, 31, 31, 7, 5, 5, 6, 6, 6, 6, 6, 2, 3, 4, 4, 31, 5, 10, 12, 13, 5, 15, 15, 12, 11, 9, 8, 6, 7, 7, 6, 7, 9, 32, 5, 33, 32, 5, 0, 7, 6, 6, 6],
        [27, 8, 32, 31, 8, 9, 31, 31, 32, 30, 32, 33, 33, 31, 31, 28, 31, 31, 31, 31, 31, 8, 7, 8, 9, 10, 5, 5, 6, 7, 8, 8, 9, 31, 10, 14, 17, 17, 4, 14, 14, 11, 10, 8, 8, 3, 2, 3, 2, 5, 9, 32, 7, 33, 32, 3, 7, 0, 6, 8, 8],
        [27, 9, 34, 32, 10, 11, 33, 33, 33, 32, 34, 35, 34, 33, 33, 30, 33, 32, 33, 33, 32, 6, 5, 6, 7, 8, 4, 3, 4, 7, 8, 8, 8, 33, 10, 14, 17, 17, 2, 16, 16, 13, 12, 10, 10, 4, 4, 5, 4, 7, 10, 33, 6, 35, 33, 5, 6, 5, 0, 9, 9],
        [25, 40, 30, 29, 6, 7, 29, 29, 30, 28, 30, 31, 31, 29, 29, 26, 29, 29, 29, 29, 29, 15, 13, 13, 14, 15, 12, 12, 13, 9, 9, 9, 9, 29, 10, 14, 16, 17, 11, 13, 13, 10, 9, 7, 6, 11, 11, 9, 9, 6, 7, 30, 13, 31, 30, 8, 10, 10, 13, 0, 40],
        [25, 40, 30, 29, 6, 7, 29, 29, 30, 28, 30, 31, 31, 29, 29, 26, 29, 29, 29, 29, 29, 15, 13, 13, 14, 15, 12, 12, 13, 9, 9, 9, 9, 29, 10, 14, 16, 17, 11, 13, 13, 10, 9, 7, 6, 11, 11, 9, 9, 6, 7, 30, 13, 31, 30, 8, 10, 10, 13, 40, 0]
    ]
    # [START demands_capacities]
    data['demands'] = [0, 31, 31, 14, 14, 11, 8, 3, 3, 2, 8, 0, 2, 16, 0, 1, 2, 0, 0, 0, 0, 6, 2, 3, 3, 3, 0, 1, 13, 3, 7, 6, 0, 4, 7, 3, 5, 2, 5, 2, 2, 0, 4, 1, 9, 1, 8, 0, 17, 0, 3, 21, 2, 28, 0, 9, 1, 4, 4, 40, 40]
    data['vehicle_capacities'] = [40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]
    # [END demands_capacities]
    data['duplicated_stations'] = [[60, 59, 1]]
    data['num_vehicles'] = 15
    data['depot'] = 0
    return data
    # [END data_model]

# [START solution_printer]
def print_solution(data, manager, routing, solution):
    """Prints solution on console."""
    print(f'Objective: {solution.ObjectiveValue()}')
    total_distance = 0
    total_load = 0
    for vehicle_id in range(data['num_vehicles']):
        index = routing.Start(vehicle_id)
        plan_output = f'Route for vehicle {vehicle_id}:\n'
        route_distance = 0
        route_load = 0
        while not routing.IsEnd(index):
            node_index = manager.IndexToNode(index)
            route_load += data['demands'][node_index]
            plan_output += f' {node_index} Load({route_load}) -> '
            previous_index = index
            index = solution.Value(routing.NextVar(index))
            route_distance += routing.GetArcCostForVehicle(
                previous_index, index, vehicle_id)
        plan_output += f' {manager.IndexToNode(index)} Load({route_load})\n'
        plan_output += f'Distance of the route: {route_distance}m\n'
        plan_output += f'Load of the route: {route_load}\n'
        print(plan_output)
        total_distance += route_distance
        total_load += route_load
    print(f'Total distance of all routes: {total_distance}m')
    print(f'Total load of all routes: {total_load}')
    # [END solution_printer]

def main(time_limit = 1):
    """Solve the CVRP problem."""
    # Instantiate the data problem.
    # [START data]
    data = create_data_model()
    # [END data]

    # Create the routing index manager.
    # [START index_manager]
    manager = pywrapcp.RoutingIndexManager(len(data['distance_matrix']),
                                           data['num_vehicles'], data['depot'])
    # [END index_manager]

    # Create Routing Model.
    # [START routing_model]
    routing = pywrapcp.RoutingModel(manager)

    # [END routing_model]

    # Create and register a transit callback.
    # [START transit_callback]
    def distance_callback(from_index, to_index):
        """Returns the distance between the two nodes."""
        # Convert from routing variable Index to distance matrix NodeIndex.
        from_node = manager.IndexToNode(from_index)
        to_node = manager.IndexToNode(to_index)
        return data['distance_matrix'][from_node][to_node]

    transit_callback_index = routing.RegisterTransitCallback(distance_callback)
    routing.AddDimension(
        transit_callback_index,
        0,
        100_000,
        True,
        'Distance')
    # [END transit_callback]

    # Define cost of each arc.
    # [START arc_cost]
    routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

    # [END arc_cost]

    # Add Capacity constraint.
    # [START capacity_constraint]
    def demand_callback(from_index):
        """Returns the demand of the node."""
        # Convert from routing variable Index to demands NodeIndex.
        from_node = manager.IndexToNode(from_index)
        return data['demands'][from_node]

    demand_callback_index = routing.RegisterUnaryTransitCallback(
        demand_callback)
    routing.AddDimensionWithVehicleCapacity(
        demand_callback_index,
        0,  # null capacity slack
        data['vehicle_capacities'],  # vehicle maximum capacities
        True,  # start cumul to zero
        'Capacity')
    # [END capacity_constraint]

    # Add Time Windows constraint.
    # [START time_windows_constraint]
    def time_callback(from_index, to_index):
        """Returns the travel time between the two nodes."""
        # Convert from routing variable Index to time matrix NodeIndex.
        from_node = manager.IndexToNode(from_index)
        to_node = manager.IndexToNode(to_index)
        return data['time_matrix'][from_node][to_node]

    time_evaluator_index = routing.RegisterTransitCallback(time_callback)
    routing.AddDimension(
        time_evaluator_index,
        5,
        40,
        False,
        'Time')
    time_dimension = routing.GetDimensionOrDie('Time')
    # Add time window constraints for each location
    for location_node in range(len(data['time_matrix'])):
        index = manager.NodeToIndex(location_node)
        time_dimension.CumulVar(index).SetRange(0, 40)

    # Add time window constraints for each vehicle start node and end node.
    for vehicle_id in range(data['num_vehicles']):
        index = routing.Start(vehicle_id)
        time_dimension.CumulVar(index).SetRange(0, 40)
        routing.AddToAssignment(time_dimension.SlackVar(index))
        index = routing.End(vehicle_id)
        time_dimension.CumulVar(index).SetRange(0, 40)
    # [END time_windows_constraint]

    # Instantiate route start and end times to produce feasible times.
    # [START depot_start_end_times]
    for i in range(data['num_vehicles']):
        routing.AddVariableMinimizedByFinalizer(
            time_dimension.CumulVar(routing.Start(i)))
        routing.AddVariableMinimizedByFinalizer(
            time_dimension.CumulVar(routing.End(i)))
    # [END depot_start_end_times]

    # Add Station Constraint
    # [START add constraint]
    for stations in data['duplicated_stations']:
        if len(stations) < 1:
            continue
        for i in range(len(stations) - 1):
            precedent_index = manager.NodeToIndex(stations[i])
            later_index = manager.NodeToIndex(stations[i+1])
            routing.solver().Add((time_dimension.CumulVar(precedent_index) + 5) <= time_dimension.CumulVar(later_index))
    # [END add constraint]

    # Setting first solution heuristic.
    # [START parameters]
    search_parameters = pywrapcp.DefaultRoutingSearchParameters()
    search_parameters.first_solution_strategy = (
        routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC)
    search_parameters.local_search_metaheuristic = (
        routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH)
    search_parameters.time_limit.FromSeconds(time_limit)
    # [END parameters]

    # Solve the problem.
    # [START solve]
    solution = routing.SolveWithParameters(search_parameters)
    # [END solve]

    # Print solution on console.
    # [START print_solution]
    if solution:
        print_solution(data, manager, routing, solution)
    else:
        print('No Solution Found !')
    # [END print_solution]

if __name__ == '__main__':
    TIME_LIMIT = 1
    if len(sys.argv) > 1:
        TIME_LIMIT = int(sys.argv[1])
    main(TIME_LIMIT)
# [END program]

What did you expect to see
or-tools v9.5 gets following answer in a second:
Objective: 240413
Route for vehicle 0:
...
Total distance of all routes: 240413m
Total load of all routes: 415
What did you see instead?
No Solution Found !
or-tools v9.6 can't find a solution even in 15 seconds.
but when removing station constraint about 'duplicated_stations', it gets an answer in a second.

 for i in range(len(stations) - 1):

I think this should be
for i in range(1, len(stations) - 1):

because 0 is the depot.

https://github.com/google/or-tools/blob/8efe0e73595524423e344fa1fca813602b96d466/ortools/constraint_solver/routing.cc#L3073-L3090

Thank you for your answer. It seems that the above constraints should be done as advised.
However, this is not the only issue I am concerned about.
The problem is that the constraint itself seems reasonable and works fine in v9.5, but sometimes it takes a long time in v9.6 depending on the data and condition.
Also I have many other constraints and expecting more.
So I made an example that reproduces the problem to clarify the situation.
For instance, simply changing the 'duplicated_stations'
data['duplicated_stations'] = [[60, 59, 1], [47, 2]]  # [[60, 59, 1]]

allows the code to find a solution in a second in v9.6 as well.


Add Geocoding.ai API

[x] My submission is formatted according to the guidelines in the contributing guide
[x] My addition is ordered alphabetically
[x] My submission has a useful description
[x] The description does not end with punctuation
[x] Each table column is padded with one space on either side
[x] I have searched the repository for any relevant issues or pull requests
[x] Any category I am creating has the minimum requirement of 3 items
[x] All changes have been [squashed][squash-link] into a single commit

Thanks for the contribution @SrihariThalla.
Can you please solve the conflicts?

Can you please solve the conflicts?

Done!


readme: fix broken security link

Issue #, if available:
Fixes https://github.com/firecracker-microvm/firecracker-go-sdk/issues/283
Description of changes:
Firecracker moved their security policy document to SECURITY.md so that GitHub would recognize the project security policy automatically.  See https://github.com/firecracker-microvm/firecracker/commit/ce1ee597c10026d753a39454b79dfe17d26d20f9.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

Looks good to me. Let me fix the BuildKite host...


Feature/basic search gke

I confirm that this contribution is made under the terms of the license found in the root directory of this repository's source tree and that I have the authority necessary to make this contribution on behalf of its copyright owner.
Took a bit of time but finally here it is ! Don't hesitate to give feedback
Thanks

Copyright 2018 Yahoo Holdings -> Copyright Verizon Media

Great work ! I don't have a gcloud account to test this on, but reading through I could not spot any obvious issues.

Thanks @aressem , if you haven't done it before you should be able to try it using Google free tier .
Only issue I faced is :
I tried to have a deployment with only configserver without container and content but it wasn't working, so I have one master with configserver, content and container


Online live demo website:  GraphQLDocumentError: Unknown directive "client"

Describe the bug
I am trying to get an understanding of how the graphql-codegen works with the @client directive.
However, when I try the online code generator https://graphql-code-generator.com and use the @client directive, the following error occurs.
GraphQLDocumentError:  Unknown directive "client". at undefined:4:16
To Reproduce
Steps to reproduce the behavior:

My GraphQL schema:

scalar Date

schema {
  query: Query
}

extend type User{
  isLoggedIn: Boolean!
}

type Query {
  me: User!
  user(id: ID!): User
  allUsers: [User]
  search(term: String!): [SearchResult!]!
  myChats: [Chat!]!
}

enum Role {
  USER,
  ADMIN,
}

interface Node {
  id: ID!
}

union SearchResult = User | Chat | ChatMessage

type User implements Node {
  id: ID!
  username: String!
  email: String!
  role: Role!
}

type Chat implements Node {
  id: ID!
  users: [User!]!
  messages: [ChatMessage!]!
}

type ChatMessage implements Node {
  id: ID!
  content: String!
  time: Date!
  user: User!
}

Documents:

I have added a @client property to the findUser query
query findUser($userId: ID!) {
  user(id: $userId) {
    ...UserFields
    isLoggedIn @client
  }
}

fragment UserFields on User {
  id
  username
  role

}

Config

generates:
  components.ts:
    plugins:
      - typescript
      - typescript-operations
      - typescript-apollo-angular

Expected behavior
The relevant types and the FindUserGQL class to be created.
Environment:
Online generator @ https://graphql-code-generator.com/

Hi @fooraiyz ,
The @client directive is only a declarative directive that being removed during runtime by apollo-client, and it's not part of the codegen, or GraphQL in general.
If you wish to use it, make sure to add the following to your schema:
directive @client on FIELD

Hi @dotansimha ,
Thanks for the prompt reply and your advice.  I have been trying to work this out but am struggling.
In the Apollo docs concerning local state management they state

What’s really cool about using a @client directive to specify client-side only fields is that you can actually combine local and remote data in one query.

Given what you have said, does this mean that it is not possible to achieve this using the 'graphql-code-generator?  In other words, to use it you have to give up strong typing?
Also was this previously possible in the pre 1.0 version?
Thanks.

@fooraiyz Sorry, I don't understand what's the issue here.
If you are using client-side local state with Apollo, you need to have 2 schemas: the remote schema, and the client-only schema.
The live-demo on the website allow you to write only 1 schema for test-purposes, but you can specify multiple schemas when you are using the codegen from the cli in your project.
Please see the docs: https://graphql-code-generator.com/docs/integrations/apollo-local-state

@dotansimha Thank you for your time and patience.  I understand now.   I am really appreciative of your help.


chore(console): dependabot

:tada: This PR is included in version 0.109.0 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


Concurrent preferences fetch causes duplicate records to be saved

I just now ran into what I think is a serious issue when retrieving a preference setting using restframework. This was for a PerInstancePreference model that I've created in my app. The exact scenario is below,

User sends request to register
The following steps run in an atomic context
2.1 User model is saved
2.2 Save 2 user preferences
2.3 Some other models for user are saved
2.2 Successful registration response is returned
User requests 2 different settings that were created in step 2.2

At step 3 I got an error saying there are more than one objects returned for the given section and name. This did not happen always which leads me to conclude that this is due to race conditions. However I'm not able to pinpoint exactly the issue thats happening here.
Some questions that I have

Even though I've already saved the 2 preferences in step 2.2, retrieving them in 3 causes them to be re-created. Could this be because the register action is being wrapped inside an atomic transaction?
I can overcome this problem by not retrieving preferences individually in step 3. However I'm concerned about what happens when a new preference is added. And different users request for the preferences to be loaded. Would this lead to multiple settings being created as well?

Will running the checkpreferences  command help me to solve problem 2?

I realise I haven't written any tests to confirm this behaviour. Will do that in the next couple of days.

I'm really sorry, I wrote you an answer today, but I must have cloose my browser window without actually sneding it.
What I would like to see is the complete stack trace of your issue, described in 3.
It should not be possible to save duplicate preferences, as we have constraints enforced at database level : https://github.com/EliotBerriot/django-dynamic-preferences/blob/develop/dynamic_preferences/models.py#L94
If you disable temporarily transactions, do you still face the issue? Dynamic-preferences was wrote at a time when I was not really aware of transactions, and I can think of many places where transactions could break things, e.g all cache-related functions that are not wrapped in a "on_commit" hook.

Since I overwrote the Meta class in my PreferenceModel the unique constraint has not been applied. I've fixed this by inheriting the parent Meta. This should prevent duplicates from being saved.
However I suspect the transaction still causes some errors. I won't have time in the next couple of weeks to look into this as I'm on vacation. Will do it once I'm back next year!

Since the time that I reported it I haven't faced this issue. Even after adding the unique constraint I did not see any errors due due duplicate preferences. However I think with multiple instances of the app running might have a chance of producing failures due to race conditions. I have added some workarounds in my application to prevent them.
I'm closing this issue as I don't see others facing the same problem as well.

For anyone that finds this later.
If you don't use sections (and hence get a NULL section in the database), the unique constraint may or may not be enforced depending on how the database handles NULLs in the first column of a unique constraint. In my current understanding, many databases will not enforce the second value's (name in this case after section) uniqueness if the first value is null.
From Cockroach DB's docs, for example:
You can insert NULL values into columns with the UNIQUE constraint because NULL is the absence of a value, so it is never equal to other NULL values and not considered a duplicate value. This means that it's possible to insert rows that appear to be duplicates if one of the values is NULL.

If you need to strictly enforce uniqueness, use the [NOT NULL constraint](https://www.cockroachlabs.com/docs/v22.2/not-null) in addition to the UNIQUE constraint. You can also achieve the same behavior through the table's [Primary Key](https://www.cockroachlabs.com/docs/v22.2/primary-key).

^ Source: https://www.cockroachlabs.com/docs/stable/unique.html
The fix on the codebase side would be to make the empty/unspecified section be the empty string instead of NULL so that uniqueness is still enforced in the DB.


Update Settings “general”

Automatically generated by Netlify CMS

👷 Deploy Preview for car-packing-challenge processing.

Name
Link

🔨 Latest commit
6db93d2cdbdde8cb3e2cb484d3880798318257e4

🔍 Latest deploy log
https://app.netlify.com/sites/car-packing-challenge/deploys/644774bbea6aff000847e005


setup pre-releases for tree-widget

Agree, looks like this will work.
The plan would then be:

Wait for this PR to complete
Complete https://github.com/iTwin/viewer-components-react/pull/402
Release 0.8.0-dev.0 with the following peer dependencies<EMAIL_ADDRESS>ui@4-dev, presentation@4-dev.
Release 0.8.0 with the following peer dependencies<EMAIL_ADDRESS>ui@4, presentation@4.
Release 0.9.0-dev.0 with the following peer dependencies: core@4-dev, ui@4-dev, presentation@4-dev.
Release 0.9.0 with the following peer dependencies: core@4, ui@4, presentation@4.

For the peer dependencies @ dev, we take the latest available dev version at the moment of release.


Documentation states more phone services are available in Korea than the operators will actually provide

Page says that calling and phone service is available for (South) Korea, however when you go to Operator Connect it lists 3 companies: Tata Communications, Intrado, and NTT.

Tata Communications says they will only provide service for 100 employees or more;
When you try to add Intrado as an Operator, it says they only provide Audio Conferencing dial-in numbers, and not Teams Phone Calling;
And NTT says they don't provide service in Korea and have asked Microsoft to remove them from the list.

So really there is only one option (Tata Communications) and if you don't need 100 phone numbers then there is no option at all.

Document Details
⚠ Do not edit this section. It is required for learn.microsoft.com ➟ GitHub issue linking.

ID: 46b3fba6-3afd-851b-33f8-30f4ea5e44f8
Version Independent ID: 5fb7767e-e572-19b3-4456-2dbbe278d346
Content: Availability in South Korea - Microsoft Teams
Content Source: Teams/country-and-region-availability-for-audio-conferencing-and-calling-plans/availability-in-south-korea.md
Service: msteams
GitHub Login: @CarolynRowe
Microsoft Alias: crowe

Hi @neilr8133, thank you for your feedback.
My apologies but I don't understand what is the specific update that you are requestion for the article. Could you provide more detail?

Hi @neilr8133 Hope all is well. Could you help us clarify the question? Thanks.

I suggest/ask that the documentation be updated to reflect that these partners are not providing service except under the circumstances indicated in my first comment.  The incorrect information in this document (and in the Teams Admin Center) caused my group to waste days trying to sign up with these vendors and is quite frustrating.
-Neil

@neilr8133, if I'm not wrong, the article does not provide the list of providers, only the services available on each country. I cannot add specific information about the providers.
NTT should be removed soon from TAC.


technology #1572

Summary of the discussion
For the implementation of #1572, as a first step technology needs to be redefined.
Type of change (CHANGELOG.md)
Updated

technology is a plan specification that describes how to combine artificial objects or other material entities and processes in a specific way.

Workflow checklist
Automation
Closes #
PR-Assignee

[ ] 🐙 Follow the Pull Request Workflow
[ ] 📝 Update the CHANGELOG.md
[ ] 📙 Add #'s to term tracker item

Reviewer

[ ] 🐙 Follow the Reviewer Guide
[ ] 🐙 Provided feedback and show sufficient appreciation for the work done

The axiom added is a temporal solution and should be reviewed when #1572 is solved completely.

In the issue, I also proposed to have a general energy technology: An energy technology is a technology that describes how to combine energy transformation units, energy transformations, energy carriers and energy in a specific way.
Maybe we include this also in this PR, this would be then the common parent for power generation technology and heat generation technology were we can then work independently.


fix(docker-compose.liquid): fixed missing image for adminer

We where missing the actual image for adminer, also fixed minor tweaks with names
fix #63

:tada: This PR is included in version 1.12.1 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


Support extra constant renaming

#8826 Pallet macro: support pallet::extra_constants
Allow renaming of constants with a procedural macro.  This will enable the convention of snake cased methods, but camel cased constant in the metadata.  e.g.
#[pallet::extra_constant]
impl<T: Config> Pallet<T> {

    #[pallet::constant_name(FooBar)]
    fn foo_bar() -> u32 {..}

}

syntax looks good to me

some minor change needs to be done to make CI happy

/tip small

/tip small

Didn't know that was a "thing".  Updated PR! <3


add_moderator() doesn't support non-full permissions

The function add_moderator() allows you to add a mod to a subreddit with full permissions, but it would be great to have a way to add a mod with partial permissions.
Thanks!

Great suggestion! If you're interested it would be fantastic if you could try to add this feature to PRAW.

This would be great. I need it for my current project.

@zachoooo are you interested in implementing the feature?

@zachoooo are you interested in implementing the feature?

@bboe Haha I wish I was half that good at coding.

Give it a try :+1:

I wanted to comment but I forgot to, but since someone just pmmed me asking on reddit about something related, I thought I'd notify those that wanted to know.
add_moderator does support non full permissions. It's just not documented because add_moderator is an aliased function of do_relationship of _modify_relationship.
The data sent to the server is updated from the kwargs, so a simple
S = r.get_subreddit('13steinj')
S.add_moderator('bboe', permissions="+posts,-config,-flair,+access,+wiki,+mail")

No idea what would be a good way to document it. Except, maybe make add_moderator a function with the @property decorator which in that way it could have custom docs. Or a regular function that defines the local do_relationship internally and then runs it that way.

Added in 6f6fa40ec830edf5e193baa9b02de93f95fce9f3.


Partially fixed tests

Thank you for your contribution! I must find time to build a more complete spec

Welcome!
Btw, Vue is gaining momentum now https://twitter.com/laracasts/status/758396261225623552?ref_src=twsrc^tfw so I expect more attention to its components from developers.

Thank you @charliekassel !


Remove component adoption labels before initial CSV copy.

https://github.com/operator-framework/operator-lifecycle-manager/issues/2091

/hold
Looking into a test failure that looks related:
[Fail] ClusterServiceVersion when a copied csv exists [It] is synchronized with the original csv

/hold cancel
Should be resolved now -- the cache-get is load-bearing and has to stay.

https://github.com/operator-framework/operator-lifecycle-manager/issues/2091
/retest


⚠ Bofrost.lu has degraded performance

In d58661a, Bofrost.lu (https://www.bofrost.lu) experienced degraded performance:

HTTP code: 200
Response time: 1693 ms

Resolved: Bofrost.lu performance has improved in c4c46ba.